Cod sursa(job #1980337)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 12 mai 2017 21:19:56
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int C[1001][1001];
int F[1001][1001];
int t[1001];
bool viz[1001];
queue <int> q;
list <int> G[1001];
int n;
bool BFS()
{
    int x;
    list <int> :: iterator it;
    q.push(1);
    fill(viz+1,viz+n+1,false);
    viz[1]=true;
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        if(x==n) continue;
        for(it=G[x].begin();it!=G[x].end();it++)
        if(!viz[*it] and C[x][*it]!=F[x][*it])
        {
            viz[*it]=true;
            q.push(*it);
            t[*it]=x;
        }
    }
    return viz[n];
}
void Edmonds_Karp()
{
    int flow=0,minflow;
    int nod;
    list <int> :: iterator it;
    while(BFS())
    {
        for(it=G[n].begin();it!=G[n].end();it++)
        if(viz[*it] and C[*it][n]!=F[*it][n])
        {
            nod=*it;
            t[n]=nod;
            minflow=2e9+1;
            while(nod!=1)
            {
                if(C[t[nod]][nod]-F[t[nod]][nod]<minflow)
                    minflow=C[t[nod]][nod]-F[t[nod]][nod];
                nod=t[nod];
            }
            nod=n;
            while(nod!=1)
            {
                F[t[nod]][nod]+=minflow;
                F[nod][t[nod]]-=minflow;
                nod=t[nod];
            }
            flow+=minflow;
        }
    }
    g<<flow;
}
int main()
{
    int m,k,i,j,c;
    f>>n>>m;
    for(k=1;k<=m;k++)
    {
        f>>i>>j>>c;
        C[i][j]=c;
        G[i].push_back(j);
        G[j].push_back(i);
    }
    Edmonds_Karp();

    return 0;
}