Cod sursa(job #2370436)

Utilizator EricEric Vilcu Eric Data 6 martie 2019 12:09:44
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int c[1001][1001],t[1001],bf[1001];
int n,m,S;
struct B{int d;B*n;}*l[1001];
bool bfs()
{
    bf[0]=1;int b=0,e=1;t[1]=-1;
    while (b<e)
    {
        int x=bf[b];
        if(x==n){return 0;}
        for(B*p=l[bf[b]];p!=NULL;)
        {
            int y=p->d;
            if(c[x][y]>0&&t[y]==0)
            {
                t[y]=x;
                bf[e]=y;++e;
            }
            p=p->n;
        }
        ++b;
    }
    return 1;
}
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;++i)l[i]=NULL;
    for(int i=1;i<=m;++i)
    {
        int a,b,cost;
        f>>a>>b>>cost;
        {B*p=new B;
        p->d=a;
        p->n=l[b];
        l[b]=p;}
        {B*p=new B;
        p->d=b;
        p->n=l[a];
        l[a]=p;}
        c[a][b]+=cost;
    }
    while(1)
    {
        if(bfs())break;
        int M=550000000;
        for(int i=n,j=t[n];j>=1;i=j,j=t[j])
        {
            M=min(M,c[j][i]);
        }
        for(int i=n,j=t[n];j>=1;i=j,j=t[j])
        {
            c[j][i]-=M;c[i][j]+=M;
        }
        S+=M;
        for(int i=1;i<=n;++i)t[i]=0;
    }
    g<<S;
}