Pagini recente » Cod sursa (job #148020) | Cod sursa (job #3040970) | Cod sursa (job #1761659) | Cod sursa (job #831486) | Cod sursa (job #298399)
Cod sursa(job #298399)
#include <stdio.h>
#include <string.h>
#define nodC ce[i]
#define nodK V[ce[i]][j]
const int MAXN = 1024;
const int MAXM = 10240;
const int MAXK = 2147483647;
int C[MAXN][MAXN];
int F[MAXN][MAXN];
int V[MAXN][MAXN];
int A[MAXM][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<=MAXM; ++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; ce[0]=1; cc=1;
memset(viz,0,sizeof(viz));
for (i=0; i<cc && i<MAXN; ++i)
for (j=1; j<=V[ nodC ][0] && j<MAXN; ++j)
{
if (F[nodC][nodK]!=C[nodC][nodK] && !viz[nodK])
{ viz[nodK]=nodC; ce[ cc++ ]=nodK; }
if (nodK==N) return 1;
}
return 0;
}
inline void rock()
{
int vale,j,i;
while (ciuperca())
{
for (j=1; j<= V[N][0] && j<MAXN; ++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<MAXN; i=viz[i])
vale=MIN(vale,C[ viz[i] ][i] - F[viz[i]][i]);
if (vale)
for (i=N; i>1 && i<MAXN; i=viz[i])
{
F[viz[i]][i]+=vale;
F[i][viz[i]]-=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[nodC][0]; ++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; cc=1; ce[0]=N; SS[N]=1;
for (i=0; i<cc; ++i)
for (j=1; j<=V[ nodC ][0]; ++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;
}