Cod sursa(job #1988324)

Utilizator victoreVictor Popa victore Data 2 iunie 2017 17:56:22
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include<cstdio>
#include<vector>
#include<queue>

using namespace std;

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

typedef pair<int,int> ii;
vector<int> g[nmax];
int tata[nmax],flux[nmax][nmax],capacitate[nmax][nmax],n;

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

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


int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int m,i,x,y,c;
    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;
    }
    int node,currflux,sz,j,fluxtotal=0;
    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])
            {
                currflux=inf;
                tata[n]=node;
                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);
}