Cod sursa(job #1143195)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 14 martie 2014 21:58:09
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.96 kb
#include<fstream>
#include<vector>
#define MAXN 710
#define INF 2000000000
using namespace std;

int N,M,Nrmuchii,Capacitate[MAXN][MAXN],Flux[MAXN][MAXN],Muchie[MAXN][MAXN];
int Dist[MAXN],Queue[MAXN*MAXN],Use[MAXN],Tata[MAXN];
int SolFlux,SolNr,Size;
vector <int> v[MAXN],cost[MAXN];

void citire() {

    ifstream in("cmcm.in");
    int x,y,val,i;
    in>>N>>M>>Nrmuchii;
    for(i=1;i<=Nrmuchii;i++) {
        in>>x>>y>>val;
        v[x+1].push_back(y+N+1);
        v[y+N+1].push_back(x+1);
        cost[x+1].push_back(val);
        cost[y+N+1].push_back(-val);
        Capacitate[x+1][y+N+1]=1;
        Muchie[x+1][y+N+1]=i;

    }
    in.close();

}

void AdaugareCapeti() {

    int i,j;
    for(i=2;i<=N+1;i++){
        v[1].push_back(i);
        v[i].push_back(1);
        cost[i].push_back(0);
        cost[1].push_back(0);
        Capacitate[1][i]=1;
    }
    for(j=N+2;j<=N+M+1;j++){
        v[j].push_back(N+M+2);
        cost[j].push_back(0);
        cost[N+M+2].push_back(0);
        v[N+M+2].push_back(j);
        Capacitate[j][N+M+2]=1;
    }
}

int Bellmanford() {

    int i,j,st,dr;
    for(i=1;i<=N+M+2;i++) {
        Dist[i]=INF;
        Use[i]=0;
        Tata[i]=-1;
    }
    Dist[1]=0;
    Use[1]=1;
    Queue[1]=1;
    st=0;dr=1;
    while(st<dr) {
        st++;
        Size=v[Queue[st]].size();
        for(i=0;i<Size;i++) {
            if( (Capacitate[Queue[st]][v[Queue[st]][i]]>Flux[Queue[st]][v[Queue[st]][i]]) && (Dist[v[Queue[st]][i]]>Dist[Queue[st]]+cost[Queue[st]][i]) ) {
                Dist[v[Queue[st]][i]]=Dist[Queue[st]]+cost[Queue[st]][i];
                Tata[v[Queue[st]][i]]=Queue[st];

                if(!Use[v[Queue[st]][i]]) {
                    dr++;
                    Queue[dr]=v[Queue[st]][i];
                    Use[v[Queue[st]][i]]=1;
                }
            }

        }

        Use[Queue[st]]=0;
    }
    if(Dist[N+M+2]<INF) {
        int flux=INF;
        for(i=N+M+2;i!=1;i=Tata[i])
            flux=min(flux,Capacitate[Tata[i]][i]-Flux[Tata[i]][i]);
        for(i=N+M+2;i!=1;i=Tata[i]){
            Flux[Tata[i]][i]+=flux;
            Flux[i][Tata[i]]-=flux;
        }
        return flux*Dist[N+M+2];
    }
    return 0;

}

void solve() {

    int i,j,ok;
    AdaugareCapeti();
    ok=1;
    while(ok) {
        ok=Bellmanford();
        SolFlux+=ok;
    }

    for(i=2;i<=N+1;i++)
        for(j=N+2;j<=N+M+2;j++)
            if(Capacitate[i][j]&&Flux[i][j]){
                    SolNr++;
                    break;
            }

}

void afisare(){

    ofstream out("cmcm.out");
    int i,j;
    out<<SolNr<<' '<<SolFlux<<'\n';
    for(i=2;i<=N+1;i++)
        for(j=N+2;j<N+M+2;j++)
            if(Capacitate[i][j]&&Flux[i][j]){
                out<<Muchie[i][j]<<' ';
                break;
            }
    out<<'\n';
    out.close();

}

int main() {

    citire();
    solve();
    afisare();
    return 0;

}