Pagini recente » Cod sursa (job #538103) | Cod sursa (job #65287) | Cod sursa (job #2265443) | Cod sursa (job #2489561) | Cod sursa (job #1547311)
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define NMAX 10005
#define inf 1 << 30;
using namespace std;
vector <int> G[NMAX], sol;
vector <pair <int, int> > v;
vector <int> :: iterator it;
queue <int> q;
int C[NMAX][NMAX], flux[NMAX][NMAX], viz1[NMAX], vizn[NMAX];
int tata[NMAX];
int N;
int bfs(){
int nod;
for(;!q.empty(); q.pop());
memset(tata, 0, sizeof(tata));
q.push(1);
while(!q.empty()){
nod = q.front();
q.pop();
for(it = G[nod].begin(); it != G[nod].end(); ++it)
if(!tata[*it] && (C[nod][*it] > 0 || flux[nod][*it] > 0)){
q.push(*it);
tata[*it] = nod;
if(*it == N) return 1;
}
}
return 0;
}
void bfs1(){
int nod;
viz1[1] = 1;
q.push(1);
while(!q.empty()){
nod = q.front();
q.pop();
for(it = G[nod].begin(); it != G[nod].end(); ++it)
if(!viz1[*it] && C[nod][*it] > flux[nod][*it] && C[nod][*it] > flux[*it][nod]){
viz1[*it] = 1;
q.push(*it);
}
}
}
void bfsn(){
int nod;
vizn[N] = 1;
q.push(N);
while(!q.empty()){
nod = q.front();
q.pop();
for(it = G[nod].begin(); it != G[nod].end(); ++it)
if(!vizn[*it] && C[nod][*it] > flux[nod][*it] && C[nod][*it] > flux[*it][nod]){
vizn[*it] = 1;
q.push(*it);
}
}
}
int main(){
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
int M, x, y, c, i, r;
scanf("%d %d", &N, &M);
for(int i = 1; i <= M; ++i){
scanf("%d %d %d", &x, &y, &c);
C[x][y] = C[y][x] = c;
G[x].push_back(y);
G[y].push_back(x);
v.push_back(make_pair(x, y));
}
for(int fx = 0; bfs(); fx += r){
r = inf;
i = N;
while(i != 1){
if(C[tata[i]][i] > 0)
r = min(r, C[tata[i]][i]);
else r = min(r, flux[tata[i]][i]);
i = tata[i];
}
i = N;
while(i != 1){
if(C[tata[i]][i] > 0){
C[tata[i]][i] -= r;
flux[i][tata[i]] += r;
}else flux[tata[i]][i] -= r;
i = tata[i];
}
}
bfs1();
bfsn();
for(int i = 0; i < M; ++i)
if(C[v[i].first][v[i].second] == flux[v[i].first][v[i].second] || C[v[i].second][v[i].first] == flux[v[i].second][v[i].first])
if((viz1[v[i].first] && vizn[v[i].second]) || (viz1[v[i].second] && vizn[v[i].first]))
sol.push_back(i);
printf("%d\n", sol.size());
for(it = sol.begin(); it != sol.end(); ++it)
printf("%d\n", *it+1);
/*va_list args;
va_start(args, nr_elem_din_lista);
for(i=1, nr_elem_din_lista){
suma += va_arg(args, int);
}
va_end(args);*/
return 0;
}