Cod sursa(job #2502655)

Utilizator Bogdan_BuzatuBuzatu Bogdan Mihai Bogdan_Buzatu Data 1 decembrie 2019 13:07:14
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.48 kb
#include<fstream>
#include<vector>
#include<deque>

using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

int n,m,x,y,capacitate,cost,start,destinatie,nod,t[20010];
int dist[50010],f[50010],c[20010][20010],z[20010][20010],flux[20010][20010],e,minim,sol,muchie[20010][20010];
vector <int > v[20010];
deque <int> coada;
int bellman(){
     for(int i=1;i<=destinatie;i++){
        dist[i]=1000000000;
        f[i]=0;
    }
    coada.clear();
    coada.push_back(start);
    f[start]=1;
    dist[start]=0;
    int checked=0;


    while(!coada.empty()){
        x=coada.front();
        coada.pop_front();
        f[x]=0;
        for(int i=0;i<v[x].size();i++){
            nod=v[x][i];
            if(dist[nod]>dist[x]+z[x][nod] &&c[x][nod] >flux[x][nod] ){
                dist[nod]=dist[x]+z[x][nod];
                t[nod]=x;
                if(f[nod]==0){
                    f[nod]=1;
                    coada.push_back(nod);
                    if(nod==destinatie){
                        checked=1;
                    }

                }

            }

        }

    }

    return checked;

}

int main(){

    fin>>n>>m>>e;
    destinatie=n+m+1;
    start=0;
    for(int i=1;i<=e;i++){

        fin>>x>>y;
        cost=0;
        y=y+n;
        v[x].push_back(y);
        v[y].push_back(x);
        c[0][x]=1;
        c[x][y]=1;
        c[y][destinatie]=1;
        z[x][y]=cost;
        z[y][x]=-cost;
        muchie[x][y]=i;
    }

    for(int i=1;i<=n;i++){
        v[i].push_back(start);
        v[start].push_back(i);
        z[i][start]=0;
        z[start][i]=0;
    }
    for(int i=n+1;i<=n+m;i++){
        v[i].push_back(destinatie);
        v[destinatie].push_back(i);
        z[i][destinatie]=0;
        z[destinatie][i]=0;
    }
    cost=0;
    while(bellman()){

         minim=100000000000;
         nod=destinatie;
         while(nod!=0){
            minim =min(minim,c[t[nod]][nod]-flux[t[nod]][nod]);
            nod=t[nod];
         }
         nod=destinatie;
         while(nod!=0){
            cost+=minim*z[t[nod]][nod];
             flux[t[nod]][nod]+=minim;
             flux[nod][t[nod]]-=minim;
            nod=t[nod];
         }

        sol+=minim;


    }
    fout<<sol<<"\n";
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n+m;j++){
            if(flux[i][j]==1){
                fout<<i<<" "<<j-n<<"\n";
            }
        }
    }


    return 0;



}