Pagini recente » Cod sursa (job #2155463) | Cod sursa (job #616514)
Cod sursa(job #616514)
#include<stdio.h>
#include<vector>
#define maxn 1005
#define maxm 10005
using namespace std;
FILE*f=fopen("critice.in","r");
FILE*g=fopen("critice.out","w");
int n,m,i,c,nod,nodvcn,ok,minim,p,u;
int X[maxm],Y[maxm],Cp[maxn][maxn],F[maxn][maxn],viz[maxn],C[maxn],T[maxn],r[2][maxn],criticals[maxm],nrc;
vector<int>G[maxn]; vector<int>::iterator itt;
inline void citire () {
fscanf(f,"%d %d",&n,&m);
for ( i = 1 ; i <= m ; ++i ){
fscanf(f,"%d %d %d",&X[i],&Y[i],&c);
G[ X[i] ].push_back(Y[i]);
G[ Y[i] ].push_back(X[i]);
Cp[X[i]][Y[i]] = Cp[Y[i]][X[i]] = c;
}
}
inline bool Bfs () {
for ( i = 1 ; i <= n ; ++i ) viz[i] = 0;
p = u = 1; C[1] = 1; ok = 0; viz[1] = 1;
while ( p <= u ){
nod = C[p];
for ( itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
nodvcn = *itt;
if ( viz[nodvcn] || Cp[nod][nodvcn] == F[nod][nodvcn] ) continue ;
if ( nodvcn == n ){
ok = 1; continue ;
}
viz[nodvcn] = 1; T[nodvcn] = nod;
C[++u] = nodvcn;
}
++p;
}
return ok;
}
inline void maxflow () {
while ( Bfs() ){
for ( itt = G[n].begin() ; itt != G[n].end() ; ++itt ){
T[n] = (*itt); nod = n; minim = 1<<30;
for ( ; T[nod] ; nod = T[nod] ){
minim = min(minim,Cp[T[nod]][nod]-F[T[nod]][nod]);
}
nod = n;
if ( minim ){
for ( ; T[nod] ; nod = T[nod] ){
F[T[nod]][nod] += minim;
F[nod][T[nod]] -= minim;
}
}
}
}
}
inline void Bfs2 ( int nod , int tip ){
p = u = 1; C[1] = nod; r[tip][nod] = 1;
while ( p <= u ){
nod = C[p];
for ( itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
nodvcn = *itt;
if ( !r[tip][nodvcn] && F[nod][nodvcn] < Cp[nod][nodvcn] ){
r[tip][nodvcn] = 1;
if ( !((nodvcn == n && nod == 1) || (nodvcn == 1 && nod == n)) ){
C[++u] = nodvcn;
}
}
}
++p;
}
}
inline void find_edges () {
Bfs2(1,0); Bfs2(n,1);
for ( i = 1 ; i <= m ; ++i ){
if ( F[X[i]][Y[i]] == Cp[X[i]][Y[i]] ){
if ( r[0][X[i]] && r[1][Y[i]] )
criticals[++nrc] = i;
}
if ( F[Y[i]][X[i]] == Cp[X[i]][Y[i]] ){
if ( r[0][Y[i]] && r[1][X[i]] )
criticals[++nrc] = i;
}
}
fprintf(g,"%d\n",nrc);
for ( i = 1 ; i <= nrc ; ++i ){
fprintf(g,"%d\n",criticals[i]);
}
}
int main () {
citire();
maxflow();
find_edges();
fclose(f);
fclose(g);
return 0;
}