Cod sursa(job #1968128)

Utilizator alex99Chelba Alexandru alex99 Data 17 aprilie 2017 15:06:20
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.62 kb
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
/**
int n,m,viz[1001],s,d;
int f[1001][1001],c[1001][1001];
int q[1001];
int bfs()
{
    int p,u,i,x;
    q[0]=s;
    p=u=0;
    viz[s]=1;
    while(p<=u&&!viz[d])
    {
        x=q[p++];
        for(int i=1;i<=n;i++)
        if(!viz[i])
            if(f[x][i]<c[x][i]) {viz[i]=x; q[++u]=i;}
            else
            if(f[i][x]>0) {viz[i]=-x; q[++u]=i;}
    }
    return !viz[d];
}
void damfluxlapompa()
{
    int i,a,b,lg,v;
    int l[101];

    do
    {
        memset(viz,0,sizeof(viz));
        if(bfs()) return ;
        l[0]=d;lg=0;
        a=b=INF;
        while(l[lg]!=s)
        {
            ++lg;
            l[lg]=abs(viz[l[lg-1]]);
            if(viz[l[lg-1]]>0) a=min(a,c[l[lg]][l[lg-1]]-f[l[lg]][l[lg-1]]);
            else
            if(viz[l[lg-1]]<0) b=min(b,f[l[lg-1]][l[lg]]);
        }
        v=min(a,b);
        for(int i=lg;i>0;i--)
        if(viz[l[i-1]]>0)
            f[l[i]][l[i-1]]+=v;
        else
            f[l[i-1]][l[i]]-=v;
    }while(1);
}
int main()
{
    f1>>n>>m;
    s=1; d=n;
    for(int i=1;i<=m;i++)
    {
        int x,y,flux;
        f1>>x>>y>>flux;
        c[x][y]=flux;
    }
    damfluxlapompa();
    int sum=0;
    for(int i=1;i<=n;i++)
        sum+=f[i][d];
    g<<sum<<'\n';
    return 0;
}
**/

int n,m,s,d;
vector<int> v[1001];
int flux,c[1001][1001],t[1001];
queue<int> q;
int bf()
{
    memset(t,0,sizeof(t));
    t[1]=1;
    q.push(s);
    while(q.size())
    {
        int i=q.front();
        q.pop();
        for(auto j: v[i])
        {
            if(t[j]==0&&c[i][j]>0)
            {
                t[j]=i;
                if(j!=d) q.push(j);
            }
        }
    }
    if(t[d]) return 1;
    return 0;
}
int flux_maxim()
{
    while(bf())
    {
        for(auto i: v[d])
        if(t[i])
        {
            t[d]=i;
            int minn=2000000000;
            i=d;
            while(i!=s)
            {
                minn=min(minn,c[t[i]][i]);
                i=t[i];
            }
            i=d;
            while(i!=s)
            {
                c[t[i]][i]-=minn;
                c[i][t[i]]+=minn;
                i=t[i];
            }
            flux+=minn;
        }
    }
    return flux;
}
int main()
{
    f>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y,ci;
        f>>x>>y>>ci;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y]=ci;
    }
    s=1; d=n;
    g<<flux_maxim()<<'\n';
    return 0;
}