Pagini recente » Cod sursa (job #2237679) | Cod sursa (job #2862355) | Cod sursa (job #2896744) | Cod sursa (job #3182255) | Cod sursa (job #295992)
Cod sursa(job #295992)
#include <stdio.h>
const int MAXN = 1024;
const int MAXK = 2147483647;
int C[MAXN][MAXN];
int F[MAXN][MAXN];
int V[MAXN][MAXN];
int A[10*MAXN][2];
int viz[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 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=1; i<=M; ++i)
{
scanf("%d%d%d",&X,&Y,&Z);
C[X][Y]+=Z; C[Y][X]+=Z;
V[X][++V[X][0]]=Y; V[Y][++V[Y][0]]=X;
A[i][0]=X; A[i][1]=Y;
}
}
inline int ciuperca()
{
int i,j,nodC,nodK;
ce[0]=1; cc=1; viz[1]=-1;
for (i=2; i<=N; ++i) viz[i]=0;
for (i=0; i<cc && i<MAXN; ++i)
{
nodC=ce[i];
if (nodC!=N)
for (j=1; j<=V[ nodC ][0]; ++j)
{
nodK=V[nodC][j];
if (F[nodC][nodK]!=C[nodC][nodK] && !viz[nodK])
{ viz[nodK]=nodC; ce[ cc++ ]=nodK; }
}
}
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] ])
{
viz[N] = V[N][j]; vale=MAXK;
for (i=N; i!=1; i=viz[i])
vale=MIN(vale,C[ viz[i] ][i] - F[viz[i]][i]);
if (vale)
for (i=N; i!=1; i=viz[i])
{
F[viz[i]][i]+=vale;
F[i][viz[i]]-=vale;
}
munte+=vale;
}
}
}
inline void paper()
{
int i,j,nodC=0,nodK=0; cc=1; ce[0]=1; PP[1]=1;
for (i=0; i<cc && i<MAXN; ++i)
{
nodC=ce[i];
for (j=1; j<=V[nodC][0]; ++j)
{
nodK=V[nodC][j];
if (!PP[ nodK ] && C[ nodC ][ nodK ] > F[ nodC ][ nodK ] && C[ nodC ][ nodK ] >F[ nodK ][ nodC ] )
{ ce[cc++]=nodK; PP[ nodK ] = 1; }
}
}
}
inline void scisors()
{
int i,j,nodC=0,nodK=0; cc=1; ce[0]=N; SS[N]=1;
for (i=0; i<cc && i<MAXN; ++i)
{
nodC=ce[i];
for (j=1; j<=V[ nodC ][0]; ++j)
{
nodK=V[nodC][j];
if (!SS[ nodK ] && C[ nodC ][ nodK ] > F[ nodC ][ nodK ] && C[ nodC ][ nodK ] >F[ nodK ][ nodC ] )
{ ce[cc++]=nodK; SS[ nodK ] = 1; }
}
}
}
inline void mushroom()
{
int i;
for (i=1; i<=M; ++i)
{
if ( ( PP[ A[i][0] ] && SS[ A[i][1] ] ) || ( PP[ A[i][1] ] && SS[ A[i][0] ] ) )
RR[rez++]=i;
}
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;
}