Cod sursa(job #1266186)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 18 noiembrie 2014 14:13:03
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#define INF 2000000000
using namespace std;
vector<int>L[610];
queue<int>q;
int n,m,e,i,j,a,poz,b,cc,vmin,s,cost,c[610][610],w[610][610],x[610][610],mc[610][610],d[610],t[610];
FILE *f,*g;
int minim(int a,int b){
    if(a<b)
        return a;
    return b;
}
int bf(){
    q.push(0);
    memset(t,0,sizeof(t));
    for(int i=0;i<=n+m+1;i++){
        d[i]=INF;
    }
    d[0]=0;
    t[0]=-1;
    while(!q.empty()){
        poz=q.front();
        q.pop();
        for(int i=0;i<L[poz].size();i++){
            a=L[poz][i];
            if(d[a]>d[poz]+x[poz][a]&&c[poz][a]>w[poz][a]){
                d[a]=d[poz]+x[poz][a];
                q.push(a);
                t[a]=poz;
            }
        }
    }
    return d[n+m+1]!=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,&cc);
        L[a].push_back(b+n);
        L[b+n].push_back(a);
        c[a][b+n]=1;
        x[a][b+n]=cc;
        x[b+n][a]=-cc;
        mc[a][b+n]=mc[b+n][a]=i;
    }
    for(i=1;i<=n;i++){
        L[0].push_back(i);
        L[i].push_back(0);
        c[0][i]=1;
    }
    for(i=1;i<=m;i++){
        L[n+m+1].push_back(i+n);
        L[i+n].push_back(n+m+1);
        c[i+n][n+m+1]=1;
    }
    while(bf()){
        a=t[n+m+1];
        if(c[a][n+m+1]>w[a][n+m+1]){
            vmin=c[a][n+m+1]-w[a][n+m+1];
            while(t[a]!=-1){
                vmin=minim(vmin,c[ t[a] ][a]-w[ t[a] ][a]);
                a=t[a];
            }
            a=n+m+1;
            while(t[a]!=-1){
                w[ t[a] ][a]+=vmin;
                w[a][ t[a] ]-=vmin;
                a=t[a];
            }
            s+=vmin;
            cost+=d[n+m+1]*vmin;
        }
    }
    fprintf(g,"%d %d\n",s,cost);
    for(i=1;i<=n;i++){
        for(j=0;j<L[i].size()-1;j++){
            if(w[i][ L[i][j] ]==1)
                fprintf(g,"%d ",mc[i][ L[i][j] ]);
        }
    }

    fclose(f);
    fclose(g);
    return 0;
}