Pagini recente » Cod sursa (job #1193645) | Cod sursa (job #1723759) | Cod sursa (job #2087232) | Cod sursa (job #157422) | Cod sursa (job #293569)
Cod sursa(job #293569)
#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 viz[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[i].a=X; A[i].b=Y; No[X]++; No[Y]++;
}
for (i=1; i<=N; ++i)
{ V[i]=new int [ No[i] +2 ]; V[i][0]=0; }
for (i=0; i<M; ++i)
{
V[ A[i].a ][ ++V[A[i].a][0] ]=A[i].b;
V[ A[i].b ][ ++V[A[i].b][0] ]=A[i].a;
}
}
inline int ciuperca()
{
int i,j;
ce[0]=1; cc=1; viz[1]=1;
for (i=2; i<=N; ++i)viz[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] ] && viz[ V[ ce[i] ][j] ]==0)
{
viz[ V[ ce[i] ][j] ] = 1;
ce[ cc++ ] = V[ ce[i] ][j];
cE[ V[ ce[i] ][j] ] = ce[i];
}
return viz[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] && viz[ 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;
for (i=0; i<M; ++i)
{
if ( ( PP[ A[i].a ] && SS[ A[i].b ] ) || ( PP[ A[i].b ] && SS[ A[i].a ] ) )
RR[rez++]=i+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;
}