Cod sursa(job #3225564)

Utilizator Savu_Stefan_CatalinSavu Stefan Catalin Savu_Stefan_Catalin Data 17 aprilie 2024 23:07:40
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int NMAX=5e5,inf=1e9;
int n,m,lv[NMAX+5],ptr[NMAX+5];
vector <int> v[NMAX+5];
vector <pair<pair<int,int>,pair<int,int> > > edge;
int bfs(int s,int t)
{
    lv[s]=0;
    queue <int> q;
    q.push(s);
    while (!q.empty())
    {
        auto t=q.front();
        q.pop();
        for (int i=0;i<v[t].size();++i)
        {
            if (lv[edge[v[t][i]].first.second]==-1&&edge[v[t][i]].second.first>edge[v[t][i]].second.second)
            {
                q.push(edge[v[t][i]].first.second);
                lv[edge[v[t][i]].first.second]=lv[t]+1;
            }
        }
    }
    return lv[t];
}
int dfs(int nod,int sink,int flow)
{
    if (flow==0) return 0;
    if (nod==sink) return flow;
    for (;ptr[nod]<v[nod].size();++ptr[nod])
    {
        auto t=edge[v[nod][ptr[nod]]];
        if (lv[t.first.first]+1!=lv[t.first.second]||(!(t.second.first>t.second.second))) continue;
        int f=dfs(t.first.second,sink,min(flow,t.second.first-t.second.second));
        if (f==0) continue;
        edge[v[nod][ptr[nod]]].second.second+=f;
        edge[v[nod][ptr[nod]]^1].second.second-=f;
        return f;
    }
    return 0;
}
int dinic(int s,int t)
{
    int flow=0;
    while (true)
    {
        for (int i=1;i<=n;++i)
            lv[i]=-1;
        if (bfs(s,t)==-1) break;
        for (int i=1;i<=n;++i)
            ptr[i]=0;
        while (true)
        {
            int f=dfs(s,t,inf);
            flow+=f;
            if (f==0) break;
        }
    }
    return flow;
}
int main()
{
    in>>n>>m;
    int cnt=0;
    for (int i=1;i<=m;++i)
    {
        int x,y,z;
        in>>x>>y>>z;
        if (z==0) continue;
        v[x].push_back(cnt);
        v[y].push_back(cnt+1);
        edge.push_back({{x,y},{z,0}});
        edge.push_back({{y,x},{0,0}});
        cnt+=2;
    }
    out<<dinic(1,n);
    return 0;
}