Cod sursa(job #2696052)

Utilizator antonioganea3Antonio Ganea antonioganea3 Data 15 ianuarie 2021 09:52:07
Problema Critice Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;

#define INF 1 << 30

int n, m;

int c[1005][1005];
int f[1005][1005];

int fiu[1005];

bool ok[1005];

vector<int> v[1005], sol;

pair<int, int> edges[10005];

bool bfs()
{
    memset(ok, 0, sizeof(ok));

    queue<int> q;
    q.push(1);

    ok[1] = true;

    while(!q.empty()){
        int k = q.front();
        q.pop();

        for ( auto it : v[k] ){
            if(f[k][it] != c[k][it] && !ok[it]){
                fiu[it] = k;
                ok[it] = true;
                q.push(it);
                if(it == n)
                    return true;
            }
        }
    }

    return false;
}

void read(){
    ifstream fin ("critice.in");

    fin >> n >> m;

    for ( int i = 1; i <= m; i++ ){
        int x, y, z;
        fin >> x >> y >> z;
        edges[i] = make_pair(x, y);
        c[x][y] = z;
        c[y][x] = z;
        v[x].push_back(y);
        v[y].push_back(x);
    }
}


int main()
{
    read();

    int flow = 0;

    while( bfs() )
        for ( auto it : v[n] )
            if( f[it][n] != c[it][n] && ok[it] ){
                int fmin = INF;
                fiu[n] = it;
                for ( int i = n; i != 1; i = fiu[i] )
                    fmin = min(fmin, c[fiu[i]][i] - f[fiu[i]][i]);

                if( fmin == 0 )
                    continue;

                for ( int i = n; i != 1; i = fiu[i] ){
                    f[fiu[i]][i] += fmin;
                    f[i][fiu[i]] -= fmin;
                }

                flow += fmin;

            }

    bfs();

    for ( int i = 1; i <= m; i++ ){
        int x = edges[i].first;
        int y = edges[i].second;
        if( (ok[x] && !ok[y]) || (!ok[x] && ok[y]) )
            sol.push_back(i);

    }

    ofstream fout ("critice.out");

    fout << sol.size() << "\n";

    for ( auto it : sol )
        fout << it << "\n";

    return 0;

}