Cod sursa(job #692469)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 26 februarie 2012 16:20:24
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 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;
        }
    }
    if(!ok) return 0; else return 1;
}
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())
    {
        fmin=int(2e9);
        for(int i=n;i!=1;i=p[i])
        fmin=min(fmin,C[p[i]][i]-F[p[i]][i]);

        for(int i=n;i!=1;i=p[i])
        {
            F[p[i]][i]+=fmin;
            F[i][p[i]]-=fmin;
        }
        flow+=fmin;
    }
    fo<<flow<<"\n";
    return 0;
}