Cod sursa(job #2469238)

Utilizator mirceaisherebina mircea mirceaishere Data 6 octombrie 2019 17:18:07
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <deque>
using namespace std;
ifstream fin("ghizi.in");
ofstream fout("ghizi.out");

int n, m, nr, minim, sol[5010], Ai[5010], Bi[5010], x, y, k, f[5010], t[5010], capacitate[110][110], flux[110][110];
deque <int> c;
vector <int> a[110];

int bfs(){
    int ok=0;
    /// initializam vectorul de frecventa
    for(int i=0; i<=5000; i++){
        f[i]=0;
    }
    c.push_back(1);
    f[1]=1;
    /// 1 este sursa, 102 destinatia
    while(!c.empty()){
        int nod1=c.front();
        c.pop_front();
        for(int i=0; i<a[nod1].size(); i++){
            int nod2=a[nod1][i];
            if(f[nod2]==0 && capacitate[nod1][nod2]>flux[nod1][nod2]){
                c.push_back(nod2);
                t[nod2]=nod1;
                f[nod2]=1;
                if(nod2==102){
                    ok=1;
                }
            }
        }
    }
    return ok;
}

int main(){
    fin>>m>>k;
    n=102;
    for(int i=1; i<=m; i++){
        fin>>x>>y;
        x++;
        y++;
        Ai[i]=x;
        Bi[i]=y;
        a[x].push_back(y);
        a[y].push_back(x);
        capacitate[x][y]++;
    }
    a[101].push_back(102);
    a[102].push_back(101);
    capacitate[101][102]=k;
    while(bfs()){
        for(int i=0; i<a[n].size(); i++){
            int nod=a[n][i];
            if(capacitate[nod][n]>flux[nod][n] && f[nod]==1){
                minim=capacitate[nod][n]-flux[nod][n];
                nr=nod;
                while(t[nr]){
                    minim=min(minim, capacitate[ t[nr] ][nr]-flux[ t[nr] ][nr]);
                    nr=t[nr];
                }
                nr=nod;
                flux[nod][n]+=minim;
                flux[n][nod]-=minim;
                while(t[nr]){
                    flux[ t[nr] ][nr]+=minim;
                    flux[nr][ t[nr] ]-=minim;
                    nr=t[nr];
                }
            }
        }
    }
    int nrr=0;
    for(int i=1; i<=m; i++){
        if(flux[ Ai[i] ][ Bi[i] ]>0){
            nrr++;
            sol[nrr]=i;
            flux[ Ai[i] ][ Bi[i] ]--;
        }
    }
    fout<<nrr<<"\n";
    for(int i=1; i<=nrr; i++){
        fout<<sol[i]<<" ";
    }
}