Pagini recente » Cod sursa (job #180584) | Cod sursa (job #2586858) | Cod sursa (job #2828244) | Cod sursa (job #1033788) | Cod sursa (job #528920)
Cod sursa(job #528920)
#include <stdio.h>
#define maxn 1024
#define maxm 10005
#define oo 1000000
struct nod {
int inf;
nod *next;
} *A[maxn];
struct muchii {
int a,b;
} id[maxm];
int i,N,M;
int C[maxn][maxn],from[maxn],x[maxn],y[maxn],sol[maxm];
void citire()
{
int x,y,c; nod *q;
scanf("%d %d",&N,&M);
for(i=1;i<=M;i++)
{
scanf("%d %d %d",&x,&y,&c);
q=new nod;
q->inf=y;
q->next=A[x];
A[x]=q;
q=new nod;
q->inf=x;
q->next=A[y];
A[y]=q;
C[y][x]=C[x][y]=c;
id[i].a=x; id[i].b=y;
}
}
inline int min(int a, int b)
{
return (a>b)? b : a;
}
int bfs()
{
int pi,ps,k,cd[maxn]; ps=pi=1;
//for(i=1;i<=N;i++) from[i]=0;
cd[1]=1;
while(ps<=pi)
{
k=cd[ps];
for(nod *q=A[k];q;q=q->next)
if(from[q->inf]==0 && C[k][q->inf]>0)
{
cd[++pi]=q->inf;
from[q->inf]=k;
if(q->inf==N) return 1;
}
ps++;
}
return 0;
}
void search(int st,int v[])
{
int pi,ps,k,cd[maxn];
for(i=1;i<=N;i++) v[i]=0;
pi=ps=1; cd[1]=st; v[st]=1;
while(ps<=pi)
{
k=cd[ps];
for(nod *q=A[k];q;q=q->next)
if(v[q->inf]==0 && C[k][q->inf]>0 && C[q->inf][k])
{
cd[++pi]=q->inf;
v[q->inf]=1;
}
ps++;
}
}
int main()
{
freopen("critice.in","r",stdin);
freopen("critice.out","w",stdout);
citire();
while(bfs())
{
int k=N,flux=oo;
do
{
flux=min(flux,C[from[k]][k]);
k=from[k];
}
while(k!=1);
k=N;
do
{
C[from[k]][k]-=flux;
C[k][from[k]]+=flux;
k=from[k];
}
while(k!=1);
}
search(1,x);
search(N,y);
for(i=1;i<=M;i++)
if(x[id[i].a] && y[id[i].b] || x[id[i].b] && y[id[i].a])
sol[++sol[0]]=i;
printf("%d\n",sol[0]);
for(i=1;i<=sol[0];i++)
printf("%d\n",sol[i]);
}