Cod sursa(job #2744514)

Utilizator Vadim23Vadim vadim Vadim23 Data 24 aprilie 2021 19:45:08
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.72 kb
/*#include<bits/stdc++.h>
#define ll long long
const int inf=1e9;
using namespace std;
int f[5005],to[5005],nex[5005],head[1005],u=1;
void added(int x,int y,int val)
{
    to[++u]=y;
    f[u]=val;
    nex[u]=head[x];
    head[x]=u;

    to[++u]=x;
    f[u]=0;
    nex[u]=head[y];
    head[y]=u;
}
int last[1005];
queue<int>q;
int n;
int bfs()
{
    memset(last,0,sizeof(last));
    q.push(1);
    while(!q.empty()){
        int nod=q.front(),i;
        q.pop();
        for(i=head[nod];i;i=nex[i]){
            if (f[i]!=0 && last[to[i]]==0){
                last[to[i]]=i;
                q.push(to[i]);
            }
        }
    }
    return last[n]!=0;
}
int main()
{
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
    int m,i,x,y,val;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&x,&y,&val);
        added(x,y,val);
    }
    int flux=0;
    while(bfs()){
        int mini=inf,nod=n;
        while(nod!=1){
            mini=min(mini,f[last[nod]]);
            nod=to[last[nod]^1];
        }
        nod=n;
        while(nod!=1){
            f[last[nod]]-=mini;
            f[last[nod]^1]+=mini;
            nod=to[last[nod]^1];
        }
        flux+=mini;
    }
    printf("%d\n",flux);
return 0;
}*/
#include<bits/stdc++.h>
#define ll long long
const int inf=1e9;
using namespace std;
int f[10005],to[10005],nex[10005],head[1005],u=1;
void added(int x,int y,int val)
{
    to[++u]=y;
    f[u]=val;
    nex[u]=head[x];
    head[x]=u;

    to[++u]=x;
    f[u]=0;
    nex[u]=head[y];
    head[y]=u;
}
int last[1005];
queue<int>q;
int n;
int bfs()
{
    memset(last,0,sizeof(last));
    last[1]=1;
    q.push(1);
    while(!q.empty()){
        int nod=q.front(),i;
        q.pop();
        for(i=head[nod];i;i=nex[i]){
            if (f[i]!=0 && last[to[i]]==0){
                last[to[i]]=last[nod]+1;
                q.push(to[i]);
            }
        }
    }
    return last[n]!=0;
}
int ptr[1005];
int dfs(int nod,int val)
{
    if (nod==n)
        return val;
    if (val==0)
        return 0;
    int i;
    for(i=ptr[nod];i;i=nex[i]){
        if (last[to[i]]==last[nod]+1){
            int aux=dfs(to[i],min(val,f[i]));
            if (aux==0)
                continue;
            f[i]-=aux;
            f[i^1]+=aux;
            ptr[nod]=nex[i];
            return aux;
        }
    }
    ptr[nod]=i;
    return 0;
}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int m,i,x,y,val;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&x,&y,&val);
        added(x,y,val);
    }
    int flux=0;
    while(bfs()){
        for(i=1;i<=n;i++)
            ptr[i]=head[i];
        while(ll aux=dfs(1,inf))
            flux+=aux;
    }
    printf("%d\n",flux);
return 0;
}