Pagini recente » Cod sursa (job #1279918) | Cod sursa (job #1732368) | Cod sursa (job #2883876) | Cod sursa (job #1271414) | Cod sursa (job #3006)
Cod sursa(job #3006)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define nmax 1024
#define mmax 10024
#define oo 100000
#define min(a,b) (a<b?a:b)
int n,m,a[nmax],b[nmax],c[nmax],f[nmax][nmax],v[nmax],i,j,k;
int totalflow,maxflow,maxloc,pathcapacity,curnode,prevnode[nmax],flow[nmax],nextnode;
void floww()
{
totalflow=0;
while (1)
{
for (i=1;i<=n;i++)
prevnode[i]=0,flow[i]=0,v[i]=0;
flow[1]=oo;
while (1)
{
maxflow=maxloc=0;
for (i=1;i<=n;i++)
if ((flow[i]>maxflow)&&(!v[i]))
maxflow=flow[i],maxloc=i;
if (maxloc==0)
break;
if (maxloc==n)
break;
v[maxloc]=1;
for (i=1;i<=n;i++)
if (f[maxloc][i]>0)
if (flow[i]<min(maxflow,f[maxloc][i]))
prevnode[i]=maxloc,flow[i]=min(maxflow,f[maxloc][i]);
}
if (maxloc==0)
break;
pathcapacity=flow[n];
totalflow+=pathcapacity;
curnode=n;
while (curnode!=1)
{
nextnode=prevnode[curnode];
f[nextnode][curnode]-=pathcapacity;
f[curnode][nextnode]+=pathcapacity;
curnode=nextnode;
}
}
}
void fill1(int x)
{
v[x]=1;
int i;
for (i=1;i<=n;i++)
if ((x!=i)&&(!v[i])&&(f[x][i]>0))
fill1(i);
}
void fill2(int x)
{
v[x]=2;
int i;
for (i=1;i<=n;i++)
if ((x!=i)&&(!v[i])&&(f[i][x]>0))
fill2(i);
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=0;i<m;++i)
scanf("%d%d%d",a+i,b+i,c+i),f[a[i]][b[i]]=f[b[i]][a[i]]=c[i];
floww();
memset(v,0,sizeof(v));
fill1(1);
fill2(n);
int k=0;
for (i=0;i<m;i++)
if (((v[a[i]]==1)&&(v[b[i]]==2))||((v[a[i]]==2)&&(v[b[i]]==1)))
++k;
printf("%d\n",k);
for (i=0;i<m;i++)
if (((v[a[i]]==1)&&(v[b[i]]==2))||((v[a[i]]==2)&&(v[b[i]]==1)))
printf("%d\n",i+1);
return 0;
}