Cod sursa(job #2479969)

Utilizator Bogdan_BuzatuBuzatu Bogdan Mihai Bogdan_Buzatu Data 24 octombrie 2019 18:34:47
Problema Cuplaj maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.41 kb
#include<fstream>
#include<vector>
#include<deque>

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

int n,m,x,y,capacitate,cost,start,destinatie,nod,t[610];
int dist[50010],f[50010],c[610][610],z[610][610],flux[610][610],e,minim,sol,muchie[610][610];
vector <int > v[400];
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;
        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;
        for (int ii=destinatie; ii!=start; ii= t[ii]){
             minim =min(minim,c[t[ii]][ii]-flux[t[ii]][ii]);
        }

        for (int ii=destinatie; ii!=start; ii= t[ii]){
            cost+=minim*z[t[ii]][ii];
             flux[t[ii]][ii]+=minim;
             flux[ii][t[ii]]-=minim;


        }
        sol+=minim;


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


    return 0;



}