Cod sursa(job #2391089)

Utilizator Daria09Florea Daria Daria09 Data 28 martie 2019 17:34:47
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>
#define dim 1005
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,finish,start=1;
int cap[dim][dim],before[dim];
bool seen[dim];
vector <int> graph[dim];
queue <int> q;
void Read()
{
    f>>n>>m;
    finish=n;
    for(int i=1; i<=m; ++i)
    {
        int x,y,c;
        f>>x>>y>>c;
        graph[x].push_back(y);
        graph[y].push_back(x);
        cap[x][y]+=c;
    }
}
bool Bfs()
{
    while(!q.empty())q.pop();
    for(int i=start+1; i<=finish; ++i)seen[i]=false;
    seen[start]=true;
    q.push(start);
    while(!q.empty())
    {
        int node=q.front();
        q.pop();
        if(node==finish)return true;
        for(int i=0; i<graph[node].size(); ++i)
        {
            int son=graph[node][i];
            if(!seen[son]&&cap[node][son]!=0)
            {
                seen[son]=true;
                before[son]=node;
                q.push(son);
            }
        }
    }
    return false;
}
void MaxFlow()
{
    int maxflow=0;
    while(Bfs())
        for(int i=0; i<graph[finish].size(); ++i)
        {
            int node=graph[finish][i];
            if(seen[node]&&cap[node][finish]!=0)
            {
                before[finish]=node;
                int flow=int(1e9);
                for(int son=finish; son!=start; son=before[son])
                    flow=min(flow,cap[before[son]][son]);
                maxflow+=flow;
                for(int son=finish; son!=start; son=before[son])
                {
                    cap[before[son]][son]-=flow;
                    cap[son][before[son]]+=flow;
                }
            }
        }
    g<<maxflow;
}
int main()
{
    Read();
    MaxFlow();
    return 0;
}