Pagini recente » Cod sursa (job #2670107) | Cod sursa (job #2463423) | Cod sursa (job #3176395) | Cod sursa (job #1182903) | Cod sursa (job #765663)
Cod sursa(job #765663)
#include<stdio.h>
#define Nm 1001
#define Mm 10001
#define Inf Nm*10000
#define min(a,b) ((a)<(b)?(a):(b))
int G[Nm][Nm],C[Nm][Nm],X[Mm],Y[Mm],D[Nm],n,m;
int F[Nm][Nm],A[Mm],Q[Nm],Pre[Nm],M[Nm],S[Nm],T[Nm];
void read()
{
int i,c;
freopen("critice.in","r",stdin);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",X+i,Y+i,&c);
G[X[i]][D[X[i]]++]=Y[i];
G[Y[i]][D[Y[i]]++]=X[i];
C[X[i]][Y[i]]=C[Y[i]][X[i]]=c;
}
}
int BFS_s()
{
int l,r,x,y,i;
Q[l=r=0]=1;
Pre[1]=-1;
M[1]=Inf;
for(i=2;i<=n;i++)
Pre[i]=0;
while(l<=r)
{
x=Q[l++];
for(i=0;i<D[x];i++)
{
y=G[x][i];
if(!Pre[y] && F[x][y]<C[x][y])
{
Pre[y]=x;
M[y]=min(M[x],C[x][y]-F[x][y]);
Q[++r]=y;
}
}
}
return Pre[n]!=0;
}
void BFS_t()
{
int l,r,x,y,i;
Q[l=r=0]=n;
T[n]=1;
while(l<=r)
{
x=Q[l++];
for(i=0;i<D[x];i++)
{
y=G[x][i];
if(!T[y] && F[y][x]<C[y][x])
{
T[y]=1;
Q[++r]=y;
}
}
}
}
void solve()
{
int i;
while(BFS_s())
{
i=n;
while(i>1)
{
F[Pre[i]][i]+=M[n];
F[i][Pre[i]]-=M[n];
i=Pre[i];
}
}
for(i=1;i<=n;i++)
if(Pre[i])
S[i]=1;
BFS_t();
A[0]=0;
for(i=1;i<=m;i++)
if(S[X[i]] && T[Y[i]] || S[Y[i]] && T[X[i]])
A[++A[0]]=i;
}
void write()
{
int i;
freopen("critice.out","w",stdout);
printf("%d\n",A[0]);
for(i=1;i<=A[0];i++)
printf("%d\n",A[i]);
}
int main()
{
read();
solve();
write();
return 0;
}