Cod sursa(job #1520027)

Utilizator KOzarmOvidiu Badea KOzarm Data 8 noiembrie 2015 10:58:59
Problema Flux maxim Scor 100
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)
    {
        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=nod;
        while(j>1)
        {
            Min=min(Min,c[p[j]][j]-fol[p[j]][j]);
            j=p[j];
        }
        sum+=Min;
        fol[nod][f]+=Min;
        fol[f][nod]-=Min;
        j=nod;
        while(j>1)
        {
            fol[p[j]][j]+=Min;
            fol[j][p[j]]-=Min;
            j=p[j];
        }
    }
    fout<<sum;
    return 0;
}