Cod sursa(job #1932762)

Utilizator MithrilBratu Andrei Mithril Data 20 martie 2017 08:43:13
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>
#define NMAX 1024

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];
int parent[NMAX];

bool bfs() {
    queue<int> Q;
    bitset<NMAX> vis;
    Q.push(1);
    vis[1]=1;

    for(;Q.size();Q.pop()) {
        int aux=Q.front();

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

int edmondKarp() {
    memset(f,0,sizeof(f));
    int flux=0,fluxMin=0;

    for(;bfs();flux+=fluxMin) {
        fluxMin=0x3f3f3f3f;

        for(int nod=n;nod!=1;nod=parent[nod]) {
            fluxMin=min(fluxMin,c[parent[nod]][nod]-f[parent[nod]][nod]);
        }

        for(int nod=n;nod!=1;nod=parent[nod]) {
            f[parent[nod]][nod]+=fluxMin;
            f[nod][parent[nod]]-=fluxMin;
        }
    }
    return flux;
}

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;
}