Pagini recente » Cod sursa (job #1811094) | Cod sursa (job #2761437) | Cod sursa (job #2537775) | Cod sursa (job #2677266) | Cod sursa (job #447295)
Cod sursa(job #447295)
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define FIN "critice.in"
#define FOUT "critice.out"
#define NMAX 1001
#define MMAX 12003
#define INF 0x3f3f3f3f
#include<vector>
vector < pair<int,int> > G[NMAX];
int coada[NMAX],viz[NMAX],N,M,RT[NMAX],F[NMAX][NMAX],C[NMAX][NMAX],marcare[MMAX];
int BF()
{
memset(viz,0,sizeof(viz));
int p,q;
coada[p = q = 1] = 1;
viz[1]=1;
while(p<=q)
{
int nod = coada[p++];
if(nod == N) continue;
vector< pair<int,int> >::iterator it;
for( it = G[nod].begin() ; it!=G[nod].end(); it++ )
{
if( viz[it->first] || F[nod][it->first]==C[nod][it->first] ) continue;
viz[it->first] = 1;
RT[it->first] = nod;
coada[++q] = it->first;
}
}
return viz[ N ];
}
void critice(int s,int mr)
{ int p,q;
memset(viz,0,sizeof(viz));
coada[p=q=1]=s;
viz[s]=1;
while(p<=q)
{
int nod = coada[p++];
vector<pair<int,int> >::iterator it;
for(it = G[nod].begin(); it!=G[nod].end();it++)
if(viz[it->first] == 0 )
if((mr==1 && C[nod][it->first]==F[nod][it->first]) || (mr==2 && C[it->first][nod]==F[it->first][nod]))
marcare[it->second] |= mr;
else coada[++q] = it->first , viz[it->first] =1;
}
}
int main()
{
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
scanf("%d %d",&N,&M);
for(int i=1;i<=M;i++)
{
int x,y,c;
scanf("%d %d %d",&x,&y,&c);
G[x].push_back(make_pair(y,i));
G[y].push_back(make_pair(x,i));
C[x][y]=c;
}
int flux,fmin;
for(flux = 0;BF() ; )
{
vector<pair<int,int> > ::iterator it;
for( it = G[N].begin(); it != G[N].end(); it++)
{
int nod = it->first;
if( F[nod][N]==C[nod][N] || !viz[nod] ) continue;
RT[N]=nod;
fmin=INF;
for(nod = N ;nod!=1 ; nod=RT[nod])
{
fmin=min(fmin, C[RT[nod]][nod] - F[RT[nod]][nod] );
}
if(fmin == 0) continue;
for(nod = N ;nod!=1 ; nod=RT[nod])
{
F[RT[nod]][nod] +=fmin;
F[nod][RT[nod]] -= fmin;
}
flux+=fmin;
}
}
critice(1,1);
critice(N,2);
int nr=0;
for(int i=1;i<=M;i++) if(marcare[i]==3) nr++;
printf("%d\n",nr);
for(int i=1;i<=M;i++) if(marcare[i]==3) printf("%d\n",i);
return 0;
}