Cod sursa(job #1747358)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 24 august 2016 20:03:01
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include<fstream>
#include<stdlib.h>
#include<cstring>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m,cost[1001][1001],flux[1001][1001],v[1001],tata[1001],mflow;
struct nod{
   int inf;
   nod *urm;
}*L[1001];
void adaugsf(nod *&vf,int val){
    nod *q;
    q=new nod;
    q->inf=val;
    q->urm=vf;
    vf=q;
}
int BFS(){
   int i,coada[1001],p,u,x;
   memset(v,0,sizeof(v));
   nod *q;
   p=u=1;
   coada[p]=1;v[1]=1;
   while(p<=u){
      x=coada[p];
      q=L[x];
      while(q!=0){
          if (v[q->inf]==0 && flux[x][q->inf]<cost[x][q->inf]){
            v[q->inf]=1;tata[q->inf]=x;
            if (q->inf!=n){
               u++;
               coada[u]=q->inf;
            }
          }
       q=q->urm;
      }
      p++;
   }
   return v[n];
}
void Edmonds_Karp(){
    int a,b,i,val;
    nod *q;
    while(BFS()==1){
       q=L[n];
       while(q!=0){
          if (v[q->inf]==1 && flux[q->inf][n]<cost[q->inf][n]){
               tata[n]=q->inf;
               val=900000000;
               i=n;
               while(i!=1){
                  if (val>cost[tata[i]][i]-flux[tata[i]][i]) val=cost[tata[i]][i]-flux[tata[i]][i];
                  i=tata[i];
               }
               i=n;
               while(i!=1){
                 flux[tata[i]][i]+=val;
                 flux[i][tata[i]]-=val;
                 i=tata[i];
               }
               mflow=mflow+val;
          }
          q=q->urm;
       }
    }
}
int main(){
    fin>>n>>m;
    int i,a,b;
    for (i=1;i<=n;i++)
        L[i]=0;
    for (i=1;i<=m;i++){
        fin>>a>>b;
        fin>>cost[a][b];
        adaugsf(L[a],b);
        adaugsf(L[b],a);
    }
   fin.close();
   Edmonds_Karp();
   fout<<mflow;
   fout.close();
   return 0;
}