Cod sursa(job #692520)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 26 februarie 2012 16:48:33
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
vector<int>v[1005];
queue<int>Q;
int m,n,F[1002][1002],C[1002][1002],p[1005],flow,fmin,viz[1002];
bool bf()
{
    int x;

    memset(viz,0,sizeof(viz));
    bool ok=0;
    Q.push(1); viz[1]=1;
    while(!Q.empty())
    {
        x=Q.front(); Q.pop();
        for(int i=0;i<v[x].size();i++)
        if(!viz[v[x][i]] and F[x][v[x][i]]!=C[x][v[x][i]])
        {
            p[v[x][i]]=x;
            viz[v[x][i]]=1;
            Q.push(v[x][i]);
            if(v[x][i]==n) ok=1;
        }
    }
    return ok;
}
int main()
{
    int x,y,z;
    ifstream fi("maxflow.in");
    ofstream fo("maxflow.out");
    fi>>n>>m;
    for(int i=1;i<=m;i++)
    {
        fi>>x>>y>>z;
        C[x][y]=z;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    while(bf())
	for(int i=1;i<=n;i++)
	{
		if(!p[i] or F[i][n]==C[i][n]) continue;
		p[n]=i;
        fmin=int(2e9);
        for(int j=n;j!=1;j=p[j])
        fmin=min(fmin,C[p[j]][j]-F[p[j]][j]);
        for(int j=n;j!=1;j=p[j])
        {
            F[p[j]][j]+=fmin;
            F[j][p[j]]-=fmin;
        }
        flow+=fmin;
    }
    fo<<flow<<"\n";
    return 0;
}