Pagini recente » Cod sursa (job #3286409) | Cod sursa (job #624742) | Cod sursa (job #304138) | Cod sursa (job #2449760) | Cod sursa (job #369030)
Cod sursa(job #369030)
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
#define NMAX 1005
#define INF 2000000000
#define FOR(i, v) for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
vector <int> v[NMAX];
queue <int> q;
int F[NMAX][NMAX], T[NMAX], C[NMAX][NMAX], viz[NMAX], sol[NMAX];
int M[NMAX*10][2];
bool CRT[NMAX][NMAX];
int n, m, k;
int min(int x,int y){
if(x>y) return y;
return x;
}
int BFS1(){
memset(viz, 0, sizeof(viz));
viz[1] = 1;
q.push(1);
while(!q.empty()){
int nod = q.front();
q.pop();
if(nod == n) continue;
FOR(i, v[nod]){
if(viz[*i] || C[nod][*i] == F[nod][*i]) continue;
C[*i][nod]=0;
T[*i] = nod;
viz[*i] = 1;
q.push(*i);
}
}
return viz[n];
}
void BFS2(int start,int fin){
memset(viz, 0, sizeof(viz));
viz[start]=1;
q.push(start);
while(!q.empty()){
int nod = q.front();
q.pop();
if(nod == fin) continue;
FOR(i, v[nod]){
if(viz[*i]) continue;
if(C[nod][*i] == F[nod][*i] || C[*i][nod] == F[*i][nod]) {
CRT[nod][*i]=true; //CRT [nod][*i] muchia nod->*i este posibila sa fie critica
continue;
}
viz[*i] = 1;
q.push(*i);
}
}
}
int main(){
freopen("critice.in", "r", stdin);
freopen("critice.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; ++i){
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
C[x][y]=z;
C[y][x]=z;
v[x].push_back(y);
v[y].push_back(x);
M[i][0]=x;
M[i][1]=y;
}
int flow = 0;
for(; BFS1();)
FOR(i, v[n]){
if(F[*i][n] == C[*i][n]) continue;
int flowm = INF;
for(int j = n; j != 1; j = T[j])
flowm = min( flowm, C[ T[j] ][ j ] - F[ T[j] ][ j ] );
for(int j = n; j != 1; j = T[j]){
F[ T[j] ][ j ] += flowm;
F[ j ][ T[j] ] -= flowm;
}
flow += flowm;
}
BFS2(1,n);
BFS2(n,1);
for(int i = 1; i <= m; ++i)
if(CRT[ M[i][0] ][ M[i][1] ] && CRT[ M[i][1] ][ M[i][0] ]) sol[++k] = i;
printf("%d\n", k);
for(int i = 1; i <= k; ++i)
printf("%d\n", sol[i]);
return 0;
}