Pagini recente » Cod sursa (job #45801) | Cod sursa (job #3251730) | Cod sursa (job #2821686) | Cod sursa (job #523779) | Cod sursa (job #2895304)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e3;
const int MMAX = 1e4;
struct edge {
int x;
int i;
};
vector <edge> edges[NMAX + 1];
int flux[NMAX + 1][NMAX + 1];
int p[NMAX + 1];
int critic[MMAX + 1];
int viz[NMAX + 1];
int s, d, n;
bool bfs() {
queue <int> q;
for ( int i = 1; i <= n; i ++ ) p[i] = 0;
p[s] = -1;
q.push( s );
while ( !q.empty() ) {
int node = q.front();
q.pop();
for ( auto it : edges[node] ) {
if ( flux[node][it.x] > 0 && !p[it.x] ) {
p[it.x] = node;
q.push( it.x );
}
}
}
return p[d];
}
void dfs( int node ) {
for ( auto it : edges[node] ) {
if ( viz[it.i] ) continue;
viz[it.i] = 1;
if ( flux[node][it.x] == 0 || flux[it.x][node] == 0 ) {
critic[it.i] ++;
} else {
dfs( it.x );
}
}
}
int main() {
ifstream fin( "critice.in" );
ofstream fout( "critice.out" );
int m;
fin >> n >> m;
s = 1;
d = n;
for ( int i = 1; i <= m; i ++ ) {
int a, b, c;
fin >> a >> b >> c;
flux[a][b] = c;
flux[b][a] = c;
// if ( flux[b][a] == 0 ) {
edges[a].push_back( { b, i } );
edges[b].push_back( { a, i } );
// }
}
int maxflow = 0;
while ( bfs() ) {
for ( auto it : edges[d] ) {
if ( flux[it.x][d] > 0 && p[it.x] != 0 ) {
int flow = flux[it.x][d];
for ( int i = it.x; i != s; i = p[i] ) {
flow = min( flow, flux[p[i]][i] );
}
flux[it.x][d] -= flow;
flux[d][it.x] += flow;
for ( int i = it.x; i != s; i = p[i] ) {
flux[p[i]][i] -= flow;
flux[i][p[i]] += flow;
}
maxflow += flow;
}
}
}
dfs( s );
for ( int i = 1; i <= m; i ++ ) viz[i] = 0;
dfs( d );
int cnt = 0;
for ( int i = 1; i <= m; i ++ ) cnt += critic[i] == 2;
fout << cnt << '\n';
for ( int i = 1; i <= m; i ++ ) {
if ( critic[i] == 2 ) fout << i << '\n';
}
return 0;
}