Cod sursa(job #1191083)

Utilizator alexsuciuAlex Suciu alexsuciu Data 26 mai 2014 15:38:44
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define pinf 1000000000

using namespace std;

//ifstream f("maxflow.in");
//ofstream g("maxflow.out");

int N,M;
int capacitate[1002][1002],flux[1002][1002];
int lant[1002],q[1002],viz[1002];
int pq,nq;
vector <int> l[1002];

/*void citire(int &N, int &M)
{
int x,y,capac;
    f>>N>>M;
    for(int i=1;i<=M;i++)
    {
        f>>x>>y>>capac;
        l[x].push_back(y);
        l[y].push_back(x);
        capacitate[x][y]=capac;
    }
}*/

int bf(int s, int t)
{int x;
    for(int i=1;i<=N;i++)
        viz[i]=-1;

    pq=nq=1;
    q[pq]=s;
    viz[s]=1;
    lant[s]=-1;
    while (pq<=nq)
    {
        x=q[pq];
        viz[x]=1;
        for(int i=0;i<l[x].size();i++)
            {
            if(viz[l[x][i]]==-1 && capacitate[x][l[x][i]]-flux[x][l[x][i]]>0)
                {
                    q[++nq]=l[x][i];
                    viz[l[x][i]]=1;
                    lant[l[x][i]]=x;
                }
            }
   pq++;
    }

if(viz[t]==1) return 1;
return 0;
}

int  Ford(int s, int t)
 {
    int i;
    int fluxmaxim=0;
    while (bf(s,t))
    {
        int x=pinf;
        for (i=N;lant[i]>0;i=lant[i])
            x=min(x,capacitate[lant[i]][i]-flux[lant[i]][i]);

	for (i=N;lant[i]>0;i=lant[i])
        {
            flux[lant[i]][i]+=x;
            flux[i][lant[i]]-=x;
        }
	fluxmaxim+=x;
    }
    return fluxmaxim;
 }
int main()
{
    //citire(N,M);
    int x,y,capac;
    //f>>N>>M;
    freopen ("maxflow.in","r",stdin);
    freopen ("maxflow.out","w",stdout);
    scanf("%d%d", &N,&M);
    for(int i=1;i<=M;i++)
    {
        scanf("%d%d%d",&x,&y,&capac);
        l[x].push_back(y);
        l[y].push_back(x);
        capacitate[x][y]=capac;
    }
    printf("%d",Ford(1,N));
    return 0;
}