Cod sursa(job #726869)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 27 martie 2012 16:22:22
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define MAXN 1010
using namespace std;
vector<int>v[MAXN];
int n,m,F[MAXN][MAXN],C[MAXN][MAXN],p[MAXN],fmin,flux;
queue<int>Q;
bool bfs()
{
    int x;
    memset(p,0,sizeof(p));
    Q.push(1); p[1]=1;
    while(!Q.empty())
    {
        x=Q.front(); Q.pop();
        for(int i=0;i<v[x].size();i++)
        if(!p[v[x][i]] and F[x][v[x][i]]!=C[x][v[x][i]])
        {
            p[v[x][i]]=x;
            Q.push(v[x][i]);
        }
    }
    return (p[n]>0);
}
int main()
{
    int i,x,y,z;
    ifstream fi("maxflow.in");
    ofstream fo("maxflow.out");
    fi>>n>>m;
    for(i=1;i<=m;i++)
    {
        fi>>x>>y>>z;
        C[x][y]=z;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    while(bfs())
    for(x=0;x<v[n].size();x++)
    if(p[v[n][x]] and C[v[n][x]][n]!=F[v[n][x]][n])
    {
        p[n]=v[n][x];
        for(i=n,fmin=int(2e9);i!=1;i=p[i])
        if(C[p[i]][i]-F[p[i]][i]<fmin) fmin=C[p[i]][i]-F[p[i]][i];
        if(fmin<=0) continue;
        for(i=n;i!=1;i=p[i])
        {
            F[p[i]][i]+=fmin;
            F[i][p[i]]-=fmin;
        }
        flux+=fmin;
    }
    fo<<flux<<"\n";
    return 0;
}