Pagini recente » Cod sursa (job #442926) | Cod sursa (job #1583578) | Cod sursa (job #275397) | Cod sursa (job #1641199) | Cod sursa (job #295417)
Cod sursa(job #295417)
#include<cstdio>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
#define MAX_N 1024
#define Inf 0x3f3f3f3f
vector <int> G[MAX_N];
int N,M;
int c[MAX_N][MAX_N], f[MAX_N][MAX_N];
int v1[MAX_N], v2[MAX_N];
int mx[MAX_N*10], my[MAX_N*10], p;
int T[MAX_N],m;
int okay;
void read()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d%d",&N,&M);
int x,y,z;
m=M;
while(M--)
{
scanf("%d%d%d",&x,&y,&z);
G[x].push_back(y);
G[y].push_back(x);
c[x][y] += z; c[y][x] += z;
mx[++p] = x; my[p] = y;
}
}
int bfs()
{
int p=1, u=1, Q[MAX_N];
memset(T,0,sizeof(T));
Q[1] = 1;
okay = 0;
T[1] = 1;
int x,i,V;
while(p<=u)
{
x = Q[p++];
for(i=0;i<G[x].size(); ++i)
{
V = G[x][i];
if(T[V] || c[x][V] - f[x][V] == 0) continue;
if(V == N) { okay=1; continue; }
T[V] = x;
Q[++u] = V;
}
}
return okay;
}
void maxflow()
{
int fmin,nod,i;
for(;bfs();)
{
for(i=0;i<G[N].size(); ++i)
{
if(!okay) continue;
fmin = Inf;
T[N] = G[N][i];
for(nod = N; nod!=1; nod=T[nod] )
fmin = min(fmin, c[T[nod]][nod]-f[T[nod]][nod]);
for(nod=N;nod!=1;nod=T[nod])
{
f[T[nod]][nod] += fmin;
f[nod][T[nod]] -= fmin;
}
}
}
}
void dfs(int x, int v[])
{
int i, y;
v[x] = 1;
for(i=0; i<G[x].size(); ++i)
{
y = G[x][i];
if(!v[y] && c[x][y] - f[x][y] > 0 && c[y][x] - f[y][x] > 0) dfs(y,v);
}
}
int main()
{
read();
maxflow();
dfs(1,v1); // drum de la 1 la x
dfs(N,v2); // drum de la N la x
int i, x, y, nrs = 0 , sol[10*MAX_N];
for(i=1;i<=m;++i)
{
x = mx[i]; y = my[i];
if( (c[x][y] - f[x][y] <= 0 && v1[x] && v2[y]) || ( c[y][x] - f[y][x] <= 0 && v1[y] && v2[x]) ) sol[++nrs] = i;
}
printf("%d\n",nrs);
for(i=1;i<=nrs; ++i) printf("%d\n",sol[i]);
return 0;
}