Cod sursa(job #1916596)

Utilizator blackoddAxinie Razvan blackodd Data 9 martie 2017 09:53:06
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <bits/stdc++.h>
 
using namespace std;
 
#define MaxN 10001
#define INF 0x3f3f3f3f
 
ifstream fin("critice.in");
ofstream fout("critice.out");
 
int n, m, x, a, b, z, minflow;
int c[MaxN][MaxN], f[MaxN][MaxN], t[MaxN];
pair<int,int> Edge[MaxN];
vector<int> G[MaxN], ans;
bool viz[MaxN], viz1[MaxN], viz2[MaxN];
 
void Read();
void Solve();
bool Bf();
void Bf(int, bool[]);
void Write();
 
int main() {
    Read();
    Solve();
    Write();
     
}
 
void Solve() {
     
    while(Bf()) {
        for ( const auto x : G[n] ) {
                if ( f[x][n] >= c[x][n] || !viz[x] ) 
                    continue;
                t[n] = x;
                minflow = INF;
                 
                for ( int i = n; i != 1; i = t[i] ) 
                    minflow = min(minflow, c[t[i]][i] - f[t[i]][i]);
                     
                for ( int i = n ; i != 1; i = t[i] ) {
                    f[t[i]][i] += minflow;
                    f[i][t[i]] -= minflow;
                }
            }
    }
     
    Bf(1, viz1);
    Bf(n, viz2);
     
    for ( int i = 1; i <= m; ++i ) {
        int x = Edge[i].first;
        int y = Edge[i].second;
         
        if ( (c[x][y] == f[x][y] || c[y][x] == f[y][x]) && ((viz1[x] && viz2[y]) || (viz1[y] && viz2[x])))
            ans.push_back(i);
    }
}
 
void Write() {
    fout << ans.size() << '\n';
    for ( const auto x : ans ) 
        fout << x << '\n';
}
 
void Bf(int start, bool vis[] ) {
    queue<int> Q;
    Q.push(start);
    vis[start] = true;
     
    while(Q.size()) {
        x = Q.front();
        Q.pop();
         
        for ( const auto y : G[x] ) 
            if ( c[x][y] > abs(f[x][y]) && !vis[y] ) {
                vis[y] = true;
                Q.push(y);
            }
             
    }
}   
 
bool Bf() { 
    queue<int> Q;
    Q.push(1);
    for ( int i = 1; i <= n; ++i ) viz[i] = false;
    viz[1] = true;
     
    while(Q.size()) {
        x = Q.front();
        Q.pop();
        if ( x == n ) break;
         
        for ( const auto y : G[x] ) 
            if ( c[x][y] > f[x][y] && !viz[y] ) {
                viz[y] = true;
                Q.push(y);
                t[y] = x;
            }
    }
     
    return viz[n];
     
}
 
void Read() { 
    fin >> n >> m;
     
    for ( int i = 1; i <= m; ++i ) {
        fin >> a >> b >> z;
        G[a].push_back(b);
        G[b].push_back(a);
        c[a][b] = c[b][a] = z;
        Edge[i] = {a, b};
    }
}