Cod sursa(job #2007929)

Utilizator victoreVictor Popa victore Data 4 august 2017 16:22:44
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include<cstdio>
#include<vector>
#include<queue>

using namespace std;

const int nmax=1005;
const int inf=1e9;

vector<int> g[nmax];
int capacitate[nmax][nmax],flux[nmax][nmax],n,m,tata[nmax];


inline int min(int a,int b)
{
    if(a>b)
        return b;
    return a;
}

inline bool bfs()
{
    int i;
    for(i=2;i<=n;++i)
        tata[i]=0;
    tata[1]=-1;
    queue<int> q;
    q.push(1);
    int node,sz,currnode;
    while(!q.empty())
    {
        node=q.front();
        q.pop();
        if(node==n)
            return 1;
        sz=g[node].size();
        for(i=0;i<sz;++i)
        {
            currnode=g[node][i];
            if(!tata[currnode]&&capacitate[node][currnode]>flux[node][currnode])
            {
                tata[currnode]=node;
                q.push(currnode);
            }
        }
    }
    return 0;
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int i,j,node,sz,currnode,currflux,x,y,c,fluxtotal=0;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        g[x].push_back(y);
        g[y].push_back(x);
        capacitate[x][y]=c;
    }
    while(bfs())
    {
        sz=g[n].size();
        for(i=0;i<sz;++i)
        {
            node=g[n][i];
            if(tata[node]&&capacitate[node][n]>flux[node][n])
            {
                tata[n]=node;
                currflux=inf;
                for(j=n;j!=1;j=tata[j])
                    currflux=min(currflux,capacitate[tata[j]][j]-flux[tata[j]][j]);
                for(j=n;j!=1;j=tata[j])
                {
                    flux[tata[j]][j]+=currflux;
                    flux[j][tata[j]]-=currflux;
                }
                fluxtotal+=currflux;
            }
        }
    }
    printf("%d",fluxtotal);
}