Cod sursa(job #1518005)

Utilizator DeltaMTP Dragos DeltaM Data 5 noiembrie 2015 10:22:00
Problema Cuplaj maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include<cstdio>
#include<vector>
#include<queue>
#define INF 2000000000
using namespace std;
vector<int>L[1010];
queue<int>q;
int n,m,e,i,j,a,b,aa,s,d,ss,sss,v[1010],x[410][410],c[410][410],M[410][410],D[1010],w[410][410],t[1010];
FILE *f,*g;
int bf(){
    for(i=1;i<=d;i++){
        v[i]=t[i]=0;
        D[i]=INF;
    }
    D[s]=0;
    q.push(s);
    t[s]=-1;
    while(!q.empty()){
        a=q.front();
        q.pop();
        v[a]=0;
        for(int i=0;i<L[a].size();i++){
            b=L[a][i];
            if( D[b] > D[a] + x[a][b] && c[a][b] > w[a][b] ){
                D[b] = D[a] + x[a][b];
                t[b]=a;
                if( v[b] == 0 ){
                    q.push(b);
                    v[b]=1;
                }
            }
        }
    }
    return D[d]!=INF;
}
int main(){
    f=fopen("cmcm.in","r");
    g=fopen("cmcm.out","w");
    fscanf(f,"%d%d%d",&n,&m,&e);
    for(i=1;i<=e;i++){
        fscanf(f,"%d%d%d",&a,&b,&aa);
        L[a].push_back(b+n);
        L[b+n].push_back(a);
        c[a][b+n]=1;
        x[a][b+n]=aa;
        x[b+n][a]=-aa;
        M[a][b+n]=M[b+n][a]=i;
    }
    s=0;
    for(i=1;i<=n;i++){
        L[s].push_back(i);
        L[i].push_back(s);
        c[s][i]=1;
    }
    d=n+m+1;
    for(i=1;i<=m;i++){
        L[d].push_back(i+n);
        L[i+n].push_back(d);
        c[i+n][d]=1;
    }
    while(bf()){
        a=t[d];
        aa=INF;
        while( t[a]!=-1 ){
            if( aa > c[ t[a] ][a] - w[ t[a] ][a] )
                aa = c[ t[a] ][a] - w[ t[a] ][a];
            a=t[a];
        }
        a=d;
        while( t[a]!=-1 ){
            w[ t[a] ][a] += aa;
            w[a][ t[a] ] -= aa;
            a=t[a];
        }
        ss += aa;
        sss += aa * D[d];
    }
    fprintf(g,"%d %d\n",ss,sss);
    for(i=1;i<=n;i++){
        for(j=0;j<L[i].size();j++){
            if( w[i][ L[i][j] ]  == 1 )
                fprintf(g,"%d ",M[i][ L[i][j] ]);
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}