Pagini recente » Cod sursa (job #2894440) | Cod sursa (job #54540) | Cod sursa (job #1829396) | Cod sursa (job #758934) | Cod sursa (job #271773)
Cod sursa(job #271773)
#include<stdio.h>
#include<vector>
#define MAXN 1002
#define MAXM 10001
using namespace std;
int i,x,y,z,m,n;
int c[MAXN][MAXN],f[MAXN][MAXN];
int tata[MAXN];
int m1[MAXM],m2[MAXM];
int v1[MAXN],v2[MAXN];
int sol[MAXN];
vector <int> a[MAXN];
int bfs()
{
int p,u,i,x,y,ok=0;
int Q[MAXN];
memset(tata,0,sizeof(tata));
tata[1]=1;
for(p=1,u=1,Q[p]=1;p<=u;p++)
{
x=Q[p];
for(i=0;i<a[x].size();i++)
{
y=a[x][i];
if((c[x][y]-f[x][y])>0 && !tata[y])
{
if(y==n)
{
ok=1;
continue;
}
tata[y]=x;
Q[++u]=y;
}
}
}
return ok;
}
void dfs(int x,int v[])
{
int i;
v[x]=1;
for(i=0;i<a[x].size();i++)
if(!v[a[x][i]] && (c[x][a[x][i]]-f[x][a[x][i]]) > 0)
dfs(a[x][i],v);
}
int main(void)
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
m1[i]=x;
m2[i]=y;
c[x][y]=c[y][x]=z;
a[x].push_back(y);
a[y].push_back(x);
}
int j;
int fmin,flx=0;
while(bfs())
{
for(i=0;i<a[n].size();i++)
if(tata[a[n][i]])
{
y=a[n][i];
fmin=c[y][n]-f[y][n];
for(x=y;x!=1;x=tata[x])
if((c[tata[x]][x]-f[tata[x]][x]) < fmin)
fmin=c[tata[x]][x]-f[tata[x]][x];
f[y][n]+=fmin;
f[n][y]-=fmin;
for(x=y;x!=1;x=tata[x])
{
f[tata[x]][x]+=fmin;
f[x][tata[x]]-=fmin;
}
flx+=fmin;
}
}
dfs(1,v1);
dfs(n,v2);
int nsol=0;
for(i=1;i<=m;i++)
{
x=m1[i];y=m2[i];
if((c[x][y]==f[x][y] || c[y][x]==f[y][x]) && ((v1[x] && v2[y]) || (v2[x] && v1[y])))
sol[++nsol]=i;
}
printf("%d\n",nsol);
for(i=1;i<=nsol;i++)
printf("%d\n",sol[i]);
return 0;
}