Pagini recente » Cod sursa (job #684671) | Cod sursa (job #647170) | Borderou de evaluare (job #315087) | Cod sursa (job #2455141) | Cod sursa (job #1069293)
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
const int inf= 1<<30;
const int nmax= 1000;
const int mmax= 10000;
int n, m;
vector <int> v[nmax+1];
int c[nmax+1][nmax+1], f[nmax+1][nmax+1], p[nmax+1], sol[mmax+1];
bool u[nmax+1];
struct edge {
int x, y;
} a[mmax+1];
int bfs( ) {
for ( int i= 0; i<=nmax; ++i ) {
u[i]= 0;
}
u[1]= 1;
queue <int> q;
q.push(1);
while ( !q.empty() ) {
int x= q.front();
q.pop();
if ( x<n ) {
for ( int i= 0; i<(int)v[x].size(); ++i ) {
int y= v[x][i];
if ( f[x][y]!=c[x][y] && u[y]==0 ) {
u[y]= 1;
q.push(y);
p[y]= x;
}
}
}
}
return u[n];
}
int maxflow( ) {
int flow= 0;
while ( bfs() ) {
for ( int i= 0; i<(int)v[n].size(); ++i ) {
int x= v[n][i];
if ( f[x][n]!=c[x][n] && u[x]==1 ) {
p[n]= x;
int fmin= inf;
for ( x= n; x!= 1; x= p[x] ) {
if ( c[p[x]][x]-f[p[x]][x]<fmin ) {
fmin= c[p[x]][x]-f[p[x]][x];
}
}
for ( x= n; x!= 1; x= p[x] ) {
f[p[x]][x]+= fmin;
f[x][p[x]]-= fmin;
}
flow+= fmin;
}
}
}
return flow;
}
int main( ) {
fin>>n>>m;
for ( int i= 1; i<=m; ++i ) {
int x, y, z;
fin>>x>>y>>z;
v[x].push_back(y);
v[y].push_back(x);
c[x][y]= c[y][x]= z;
a[i].x= x, a[i].y= y;
}
int firstflow= maxflow();
for ( int i= 1; i<=m; ++i ) {
for ( int j= 1; j<=n; ++j ) {
for ( int k= 1; k<=n; ++k ) {
f[j][k]= 0;
}
}
++c[a[i].x][a[i].y], ++c[a[i].y][a[i].x];
if ( maxflow()>firstflow ) {
++sol[0];
sol[sol[0]]= i;
}
--c[a[i].x][a[i].y], --c[a[i].y][a[i].x];
}
for ( int i= 0; i<=sol[0]; ++i ) {
fout<<sol[i]<<"\n";
}
return 0;
}