Cod sursa(job #1165960)

Utilizator UVS_Elfus_Deneo_KiraUVS-Elfus-Dutzul-Kira UVS_Elfus_Deneo_Kira Data 3 aprilie 2014 08:09:30
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include<fstream>
#include<cstdio>
#include<set>
#include<stack>
#include<vector>
#include<algorithm>
#define FOR(a,b,c) for(int a=b;a<=c;++a)
#include<cstring>
#include<bitset>
#include<cmath>
#include<iomanip>
#include<queue>
#define f cin
#define g cout
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ll long long
#define bit 20
#define inf (1<<30)
#define base 256
#define ba 255
#define N 1010
#define EPS 1e-12
#define mod  666013
#define inu "maxflow.in"
#define outu "maxflow.out"
using namespace std;
ifstream f(inu);
ofstream g(outu);
//int dx[]={0,0,0,1,-1};
//int dy[]={0,1,-1,0,0};
vector<int> v[N];
queue<int> q;
int T[N],m,c,x,y,Cp[N][N],F[N][N],n,flux,minim,des,nod,viz[N];
int bfs()
{
    q.push(1);
    memset(viz,0,sizeof(viz));
    viz[1]=1;
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        if(nod==n)
        continue;
        for(int i=0;i<v[nod].size();++i)
        {
            des=v[nod][i];
            if(Cp[nod][des]==F[nod][des]||viz[des])
            continue;
            T[des]=nod;
            viz[des]=1;
            q.push(des);
        }
    }
    return viz[n];
}
int main ()
{
    f>>n>>m;
    FOR(i,1,m)
    {
        f>>x>>y>>c;
        v[x].push_back(y);
        v[y].push_back(x);
        Cp[x][y]=c;
    }
    while(bfs())
    for(int i=0;i<v[n].size();++i)
    {
        des=v[n][i];
        if(!viz[des]||F[des][n]==Cp[des][n])
        continue;
        T[n]=des;
        des=n;
        int minim=(1<<30);
        for(;T[des];des=T[des])
        {
            minim=min(minim,Cp[T[des]][des]-F[T[des]][des]);
        }
        des=n;
        if(!minim)
        continue;
        for(;T[des];des=T[des])
        {
            F[T[des]][des]+=minim;
            F[des][T[des]]-=minim;
        }
        flux+=minim;
    }
    g<<flux;
    return 0;
}