Cod sursa(job #1256582)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 6 noiembrie 2014 16:40:43
Problema Cuplaj maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define inf 2147000000
using namespace std;
ifstream f("cmcm.in");
ofstream g("cmcm.out");

 vector <int> v[605];
 queue <int> q;
 int n,n2,m;
 int s,t,c[605][605],cost[605][605],fol[605][605],mx[50005],my[50005],use[605],ant[605],dmin[605];

 int BellmanFord()
 { int i,j,nod,nod2,newc;

     for(i=1;i<=t;i++)
      { use[i]=0;
        ant[i]=0;
        dmin[i]=inf;
      }

    q.push(s); dmin[s]=0;

    while(!q.empty())
    { nod=q.front(); q.pop();
        use[nod]=0;
         if (nod==t) continue;
       for(i=0;i<v[nod].size();i++)
       { nod2=v[nod][i];
         newc=dmin[nod]+cost[nod][nod2];
         if (fol[nod][nod2]>=c[nod][nod2] || newc>=dmin[nod2]) continue;
         dmin[nod2]=newc;
         if (!use[nod2]) {q.push(nod2); use[nod2]=1;}
         ant[nod2]=nod;
       }
    }

   return (dmin[t]!=inf);
 }


 void Flux()
 { int i,x,res,sol=0,cmax=0;

     while(BellmanFord())
     { x=t; res=inf;
        while(ant[x])
        { res=min(res,c[ant[x]][x]-fol[ant[x]][x]);
           x=ant[x];
        }

        x=t; sol+=dmin[t]*res;
        while(ant[x])
        { fol[ant[x]][x]+=res;
          fol[x][ant[x]]-=res;
          x=ant[x];
        }

        cmax++;
     }

    g<<cmax<<" "<<sol<<"\n";

    for(i=1;i<=m;i++)
    if (fol[mx[i]][my[i]+n]>0)
     g<<i<<" ";
 }

int main()
{ int i,cst,nod,nod2;
    f>>n>>n2>>m;

    s=n+n2+1; t=s+1;
    for(i=1;i<=n;i++)
    {
      v[s].push_back(i);
       c[s][i]=1;
       cost[s][i]=0;
    }

    for(i=1;i<=n2;i++)
    { v[n+i].push_back(t);
       c[n+i][t]=1;
       cost[n+i][t]=0;
    }

    for(i=1;i<=m;i++)
    { f>>mx[i]>>my[i]>>cst;
       nod=mx[i]; nod2=my[i]+n;
        v[nod].push_back(nod2);
        v[nod2].push_back(nod);
        c[nod][nod2]=1;
        cost[nod][nod2]=cst;
        cost[nod2][nod]=-cst;
    }

    Flux();
    return 0;
}