Cod sursa(job #1048074)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 5 decembrie 2013 11:21:18
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<stdio.h>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ta[1005],pret[1005][1005],q[1005];
vector<int>adi[1005];
void bfs()
{
     int start = 0, avans=1,a,b,i;
    q[0]=1;
    ta[1]=-2;
    while(avans>start && ta[n]==-1)
        {
        for(b=q[start++],i=0,a;i<adi[b].size();i++)
        {
            a=adi[b][i];
            if(ta[a]==-1 && pret[b][a]!=0)
            {
                q[avans]=a;
                avans++;
                ta[a]=b;
            }
        }
        }
}
int da()
{
    int l=0,a,z,b,mi;
    while (1)
    {
        memset(ta, -1, sizeof(ta));
        bfs();
        if(ta[n] == -1)
        break;
        for(z=1;z<=n;z++)
            if(pret[z][n] && ta[z] != -1) {
                mi=pret[z][n];
                for(a=z,b=ta[a];b>0;a=b,b=ta[a])
                    mi=min(mi,pret[b][a]);
                l+=mi;
                pret[z][n]-=mi;
                pret[n][z]+=mi;
                for(a=z,b=ta[a];b>=0;a=b,b=ta[a])
                {
                    pret[b][a]-=mi;
                    pret[a][b]+=mi;
                }
            }
    }
    return l;
}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int s,m,a,b,c,i;
        scanf("%d%d",&n,&m);
        s=1;
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            pret[a][b]+=c;
            adi[a].push_back(b);
            adi[b].push_back(a);
        }
          printf("%d\n",da());
    return 0;
}