Cod sursa(job #1519973)

Utilizator KOzarmOvidiu Badea KOzarm Data 8 noiembrie 2015 10:38:57
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <vector>
#include <string.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector <int>G[1005];
int p[1005],flx,c[1005][1005],fol[1005][1005],f,x,y,n,i,ic,sc,a[1005],Min;
bool viz[1005];
bool bfs(int i, int f)
{
    memset(viz,0,1005);
    memset(p,0,1005);
    viz[i]=1;
    ic=1;
    sc=1;
    a[1]=1;
   while(ic<=sc){
        //prelucram primul element al cozii
        int nod=a[ic];
        for(int j=0;j<G[nod].size();j++)
        if( viz[G[nod][j]]==0&&c[nod][G[nod][j]]-fol[nod][G[nod][j]]>0)
        {
            sc++;
            a[sc]=G[nod][j];
            viz[G[nod][j]]=1;
            p[G[nod][j]]=nod;
        }
        ic++;
   }
    return viz[f];
}
int main()
{ int cost,sum=0;
    fin>>f>>n;
    for(i=1;i<=n;i++)
    {
        fin>>x>>y>>cost;
        c[x][y]=cost;
        G[x].push_back(y);
         G[y].push_back(x);
    }
    while(bfs(1,f))

     for(int i=0;i<G[f].size();i++){
       //
     int  nod=G[f][i];
       int Min=c[nod][f]-fol[nod][f];
       if(Min==0||viz[nod]==0)
         continue;
        int j=a[nod];
        while(j>1)
        {
            Min=min(Min,c[p[j]][j]-fol[p[j]][j]);
            j=p[j];
        }
        p[f]=nod;
        sum+=Min;
        j=f;
        while(j>1)
        {
            fol[p[j]][j]+=Min;
            fol[j][p[j]]-=Min;
            j=p[j];
        }
    }

    fout<<sum;
    return 0;
}