Cod sursa(job #2469898)

Utilizator NashikAndrei Feodorov Nashik Data 8 octombrie 2019 11:26:07
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
///Dinitz O(n*n*m)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
queue <int> q;
struct nod{
     vector<int> adj;
}graf[1005];
struct muchie{
    int cap,u,v,flux;
};
vector<muchie> E;
int dist[1005],n,m,flux=0;
int upto[1005],s,t,cnt=0;
bool bfs(){
    for(int i=1;i<=n;i++)
        dist[i]=-1;
    q.push(s);dist[s]=0;
    while(q.empty()==false){
        int cur=q.front();
        q.pop();
        for(int i=0;i<graf[cur].adj.size();i++){
            int id=graf[cur].adj[i];
            int j=E[id].v;
            if(dist[j]==-1 and E[id].flux<E[id].cap){
                q.push(j);
                dist[j]=dist[cur]+1;
            }
        }
    }
    if(dist[t]==-1){
        return false;
    }
    return true;
}
int dfs(int nod,int mincap){
    if(mincap==0 or nod==t){
        return mincap;
    }
    while(upto[nod]<graf[nod].adj.size()){
        int i=graf[nod].adj[upto[nod]];
        int j=E[i].v;
        if(dist[nod]==dist[j]-1){
            int aug=dfs(j,min(mincap,E[i].cap-E[i].flux));
            if(aug>0){
                E[i].flux+=aug;
                if(i%2==0){
                    E[i+1].flux-=aug;
                }
                else
                    E[i-1].flux-=aug;
                return aug;
            }
        }
        upto[nod]++;
    }
    return 0;
}
int Dinitz(){
    while(1){
        for(int i=1;i<=n;i++)
        dist[i]=-1;
        if(bfs()==false){
            break;
        }
        while(1){
            for(int i=1;i<=n;i++)
            upto[i]=0;
            int currflux=dfs(1,2000000000);
            if(currflux==0){
                break;
            }
            flux+=currflux;
        }
    }
    return flux;
}
void add_muchie(int u,int v,int cap){
    muchie E1,E2;
    E1.u=u;
    E1.v=v;
    E1.cap=cap;
    E1.flux=0;
    E2.u=v;
    E2.v=u;
    E2.cap=0;
    E2.flux=0;
    graf[u].adj.push_back(cnt++);
    E.push_back(E1);
    graf[v].adj.push_back(cnt++);
    E.push_back(E2);
}
int main()
{
    cin>>n>>m;
    s=1;
    t=n;
    int x,y,c;
    for(int i=1;i<=m;i++){
        cin>>x>>y>>c;
        add_muchie(x,y,c);
    }
    cout<<Dinitz();
    return 0;
}