Pagini recente » Cod sursa (job #607828) | Cod sursa (job #934840) | Cod sursa (job #121264) | Cod sursa (job #1511531) | Cod sursa (job #2071271)
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
ifstream fin("critice.in");
ofstream fout("critice.out");
int n, m, f[1005], C[1005][1005], F[1005][1005], minim, T[1005];
vector<int> v[1005], sol;
pair<int,int> p[10005];
queue<int> q;
int bfs( int S ){
memset( T, 0, sizeof(T) );
memset( f, 0, sizeof(f) );
q.push( S );
f[S] = 1;
while( !q.empty() ){
int nod = q.front();
q.pop();
if( nod == n )
continue;
for( int i = 0; i < v[nod].size(); i++ ){
int vecin = v[nod][i];
if( f[vecin] == 0 && C[nod][vecin] > F[nod][vecin] ){
f[vecin] = 1;
T[vecin] = nod;
q.push( vecin );
}
}
}
return f[n];
}
void dfs( int nod ){
f[nod] = 1;
for( int i = 0; i < v[nod].size(); i++ ){
int vecin = v[nod][i];
if( f[vecin] == 0 && C[nod][vecin] > F[nod][vecin] )
dfs( vecin );
}
}
int main(){
fin >> n >> m;
for( int i = 1; i <= m; i++ ){
int c;
fin >> p[i].first >> p[i].second >> c;
v[ p[i].first ].push_back( p[i].second );
v[ p[i].second ].push_back( p[i].first );
C[ p[i].first ][ p[i].second ] = C[ p[i].second ][ p[i].first ] = c;
}
while( bfs( 1 ) == 1 ){
for( int i = 0; i < v[n].size(); i++ ){
int nod = v[n][i];
int minim = C[nod][n] - F[nod][n];
for( ; nod != 1 && minim != 0; nod = T[nod] )
minim = min( minim, C[ T[nod] ][nod] - F[ T[nod] ][nod] );
nod = v[n][i];
F[nod][n] += minim;
F[n][nod] -= minim;
for( ; nod != 1 && minim != 0; nod = T[nod] ){
F[ T[nod] ][nod] += minim;
F[nod][ T[nod] ] -= minim;
}
}
}
memset( f, 0, sizeof(f) );
dfs( 1 );
for( int i = 1; i <= m; i++ ){
if( f[ p[i].first ] != f[ p[i].second ] )
sol.push_back( i );
}
fout << (int)sol.size() << "\n";
for( int i = 0; i < sol.size(); i++ )
fout << sol[i] << "\n";
return 0;
}