Cod sursa(job #1933091)

Utilizator MithrilBratu Andrei Mithril Data 20 martie 2017 13:46:26
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <bits/stdc++.h>
#define NMAX 1024
#define INF 0x3f3f3f3f
using namespace std;

ifstream fin("critice.in");
ofstream fout("critice.out");
int n,m;
vector<int> g[NMAX];
vector<pair<int,int> > muchii;
queue<int> answer;
int c[NMAX][NMAX],f[NMAX][NMAX];
bitset<NMAX> viz;
int parent[NMAX];

int BF()
{
    viz.reset();
    queue<int> Q;
    Q.push(1);
    viz[1] = 1;

    for (;Q.size();Q.pop()) {
        int nod = Q.front();
        if (nod == n) continue;

        for(auto q:g[nod]) {
            if(c[nod][q]==f[nod][q]||viz[q]) continue;
            viz[q]=1;
            Q.push(q);
            parent[q]=nod;
        }
    }
    return viz[n];
}

int edmondKarp() {
    memset(f,0,sizeof(f));
    int flow=0,fmin=0;

    for (flow = 0; BF();) for(auto q:g[n]) {

        if(f[q][n]==c[q][n]||!viz[q]) continue;
        parent[n]=q;

        fmin=INF;
        for(q=n;q!=1;q=parent[q]) {

            fmin=min(fmin,c[parent[q]][q]-f[parent[q]][q]);
        }
        if(fmin==0) continue;

        for(q=n;q!=1;q=parent[q]) {

            f[parent[q]][q]+=fmin;
            f[q][parent[q]]-=fmin;
        }

        flow+=fmin;
    }
    return flow;
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++) {
        int x,y,z;
        fin>>x>>y>>z;
        c[x][y]=z;
        c[y][x]=z;
        g[x].push_back(y);
        g[y].push_back(x);
        muchii.push_back(make_pair(x,y));
    }
    int fluxInit = edmondKarp();
    int muchieC=0;
    for(auto q:muchii) {
        muchieC++;
        int n1=q.first,n2=q.second;
        c[n1][n2]++;
        c[n2][n1]++;
        if(edmondKarp()>fluxInit) answer.push(muchieC);
        c[n1][n2]--;
        c[n2][n1]--;
    }
    fout<<answer.size()<<'\n';
    for(;answer.size();answer.pop()) fout<<answer.front()<<'\n';
    return 0;
}