Cod sursa(job #2071271)

Utilizator robx12lnLinca Robert robx12ln Data 20 noiembrie 2017 15:40:37
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#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;
}