Cod sursa(job #2895304)

Utilizator Tudor06MusatTudor Tudor06 Data 28 aprilie 2022 21:54:23
Problema Critice Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#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;
}