Pagini recente » Cod sursa (job #344933) | Cod sursa (job #103065) | Cod sursa (job #131437) | Cod sursa (job #416617) | Cod sursa (job #294799)
Cod sursa(job #294799)
using namespace std;
#include <stdio.h>
#include <vector>
#include <math.h>
struct borcan
{ int a,b; };
const int MAXN = 1024;
const int MAXK = 2147483647;
vector <int> V[MAXN];
borcan A[MAXN*10];
int C[MAXN][MAXN];
int F[MAXN][MAXN];
int cc[MAXN];
int vr[MAXN];
int vp[MAXN];
int viz[MAXN];
int RR[MAXN];
int N,M,Sc,rez=0;
inline int MIN (int a,int b)
{ if (a>b) return b; return a; }
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].push_back(Y); V[Y].push_back(X);
A[i].a=X; A[i].b=Y;
}
}
inline int bullshit()
{
int i,j,nodC,nodK; cc[0]=1; Sc=1; viz[1]=1; viz[N]=0;
for (i=2; i<=N; ++i) viz[i]=0;
for (i=0; i<Sc; ++i)
{
nodC=cc[i];
for (j=0; j<V[ nodC ].size(); ++j)
{
nodK=V[ nodC ][j];
if ( !viz[nodK] && C[nodC][nodK]!=F[nodC][nodK])
{
cc[ Sc++] = nodK;
viz[nodK] = nodC;
}
}
}
viz[1]=0;
return viz[N];
}
void bullshorns()
{
int i,j, vale=0;
while ( bullshit() )
for (j=0; j<V[N].size(); ++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!=0; i=viz[i])
vale=MIN(vale,C[ viz[i] ][i] - F[ viz[i] ][i]);
if (vale)
for (i=N; i!=1 && i!=0; i=viz[i])
{
F[viz[i]][i]+=vale;
F[i][viz[i]]-=vale;
}
}
}
void rock()
{
int j,i; cc[0]=1; Sc=1; vr[1]=1;
for (i=0; i<Sc; ++i)
for (j=0; j<V[ cc[i] ].size(); ++j)
if (!vr[ V[ cc[i] ][j] ] && C[ cc[i] ][ V[cc[i]][j] ] > F[ cc[i] ][ V[cc[i]][j] ] && C[ cc[i] ][ V[cc[i]][j] ] >F[ V[cc[i]][j] ][ cc[i] ] )
{ vr[ V[ cc[i] ][j] ]=1; cc[Sc++]= V[cc[i]][j]; }
}
void paper()
{
int j,i; cc[0]=N; Sc=1; vp[N]=1;
for (i=0; i<Sc; ++i)
for (j=0; j<V[ cc[i] ].size(); ++j)
if (!vp[ V[ cc[i] ][j] ] && C[ cc[i] ][ V[cc[i]][j] ] > F[ cc[i] ][ V[cc[i]][j] ] && C[ cc[i] ][ V[cc[i]][j] ] >F[ V[cc[i]][j] ][ cc[i] ] )
{ vp[ V[ cc[i] ][j] ]=1; cc[Sc++]= V[cc[i]][j]; }
}
void scisors()
{
int i;
for (i=1; i<=M; ++i)
if ( (vr[ A[i].a ] && vp[ A[i].b ] ) || (vr[ A[i].b ] && vp[ A[i].a ] ) )
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();
bullshorns();
rock();
paper();
scisors();
fclose(stdin);
fclose(stdout);
return 0;
}