Cod sursa(job #2421973)

Utilizator zhm248Mustatea Radu zhm248 Data 16 mai 2019 21:03:27
Problema Flux maxim Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int c[1001][1001],p[1001];
bool viz[1001];
vector<int>g[1001];
queue<int>q;
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int n,m,i,x,y,z,maxflow=0;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&z);
        if(!c[x][y]&&!c[y][x])
        {
            g[x].push_back(y);
            g[y].push_back(x);
        }
        c[x][y]+=z;
    }
    while(1)
    {
        memset(p,0,sizeof(p));
        memset(viz,0,sizeof(viz));
        q.push(1);
        viz[1]=true;
        while(q.size())
        {
            int top=q.front();
            q.pop();
            for(i=0;i<g[top].size();++i)
            {
                if(c[top][g[top][i]]&&!viz[g[top][i]])
                {
                    if(g[top][i]!=n)
                    {
                        p[g[top][i]]=top;
                        q.push(g[top][i]);
                    }
                    viz[g[top][i]]=true;
                }
            }
        }
        if(!viz[n])
            break;
        for(i=0;i<g[n].size();++i)
        {
            int neigh=g[n][i];
            if(viz[neigh])
            {
                int flow=c[neigh][n],poz=neigh;
                while(poz!=1)
                {
                    flow=min(flow,c[p[poz]][poz]);
                    poz=p[poz];
                }
                poz=neigh;
                while(poz!=1)
                {
                    c[p[poz]][poz]-=flow;
                    c[poz][p[poz]]+=flow;
                    poz=p[poz];
                }
                maxflow+=flow;
            }
        }
    }
    printf("%d\n",maxflow);
    return 0;
}