Pagini recente » Cod sursa (job #1353349) | Cod sursa (job #2037447) | Cod sursa (job #1775985) | Cod sursa (job #422716) | Cod sursa (job #293543)
Cod sursa(job #293543)
#include <stdio.h>
const int MAXN = 1024;
const int MAXK = 2147483647;
struct borcan
{ int a,b; };
int C[MAXN][MAXN];
int F[MAXN][MAXN];
int *V[MAXN];
borcan A[10*MAXN];
int No[MAXN];
int vizit[MAXN];
int ce[MAXN];
int cE[MAXN];
int PP[MAXN];
int SS[MAXN];
int RR[MAXN];
int N,M,cc,rez;
inline int MIN(int a, int b)
{ if (a>b) return b; return a;}
inline int MAX(int a, int b)
{ if (a>b) return a; return b;}
inline int WTF(int a)
{ if (a>-a) return a; return -a;}
inline void getstuff()
{
int i,X,Y,Z;
scanf("%d%d",&N,&M);
for (i=0; i<M; ++i)
{
scanf("%d%d%d",&X,&Y,&Z);
C[X][Y]+=Z;
C[Y][X]+=Z;
A[2*i].a=X; A[2*i].b=Y; No[X]++;
A[2*i+1].a=Y; A[2*i+1].b=X; No[Y]++;
}
for (i=1; i<=N; ++i)
{ V[i]=new int [ No[i] +2 ]; V[i][0]=0; }
for (i=0,Z=2*M; i<Z; ++i)
V[ A[i].a ][ ++V[A[i].a][0] ]=A[i].b;
}
inline int ciuperca()
{
int i,j;
ce[0]=1; cc=1; vizit[1]=1;
for (i=2; i<=N; ++i)vizit[i]=0;
for (i=0; i<cc; ++i)
if (ce[i]!=N)
for (j=1; j<=V[ ce[i] ][0]; ++j)
if (F[ce[i]][ V[ ce[i] ][j] ]!=C[ce[i]][ V[ ce[i] ][j] ] && vizit[ V[ ce[i] ][j] ]==0)
{
vizit[ V[ ce[i] ][j] ] = 1;
ce[ cc++ ] = V[ ce[i] ][j];
cE[ V[ ce[i] ][j] ] = ce[i];
}
return vizit[N];
}
inline void rock()
{
int munte=0,vale,j,i;
while (ciuperca())
for (j=1; j<= V[N][0]; ++j)
if ( F[ V[N][j] ][N]!=C[ V[N][j] ][N] && vizit[ V[N][j] ])
{
cE[N] = V[N][j]; vale=MAXK;
for (i=N; i!=1; i=cE[i])
vale=MIN(vale,C[ cE[i] ][i] - F[cE[i]][i]);
if (vale)
for (i=N; i!=1; i=cE[i])
{
F[cE[i]][i]+=vale;
F[i][cE[i]]-=vale;
}
munte+=vale;
}
}
inline void paper()
{
int i,j; cc=1; ce[0]=1; PP[1]=1;
for (i=0; i<cc; ++i)
for (j=1; j<=V[ ce[i] ][0]; ++j)
if (!PP[ V[ce[i]][j] ] && C[ ce[i] ][ V[ce[i]][j] ] > WTF(F[ ce[i] ][ V[ce[i]][j] ] ))
{ ce[cc++]=V[ce[i]][j]; PP[ V[ce[i]][j] ] = 1; }
}
inline void scisors()
{
int i,j; cc=1; ce[0]=N; SS[N]=1;
for (i=0; i<cc; ++i)
for (j=1; j<=V[ ce[i] ][0]; ++j)
if (!SS[ V[ce[i]][j] ] && C[ ce[i] ][ V[ce[i]][j] ] > WTF(F[ ce[i] ][ V[ce[i]][j] ] ))
{ ce[cc++]=V[ce[i]][j]; SS[ V[ce[i]][j] ] = 1; }
}
inline void mushroom()
{
int i,k=M*2;
for (i=0; i<k; i+=2)
{
if ( ( PP[ A[i].a ] && SS[ A[i].b ] ) || ( PP[ A[i].b ] && SS[ A[i].a ] ) )
RR[rez++]=i/2+1;
}
printf("%d\n",rez);
for (i=0; i<rez; ++i)
printf("%d\n",RR[i]);
}
int main()
{
freopen("critice.in" ,"r",stdin );
freopen("critice.out","w",stdout);
getstuff();
rock();
paper();
scisors();
mushroom();
fclose(stdin );
fclose(stdout);
return 0;
}