Cod sursa(job #417774)

Utilizator hadesgamesTache Alexandru hadesgames Data 14 martie 2010 20:22:38
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
//dinic
#include <cstdio>
#include <vector>
using namespace std;
#define pb push_back
FILE *in,*out;
vector<int> a[1050];
int n,nrfi,b[1050],cap[1050][1050];
int pred[1050],q[1050],rez;
int inc_flux(int fiu)
{
	int vflux,y;
	vflux=cap[fiu][n];
	y=fiu;
	while (y!=1)
	{
		if (cap[pred[y]][y]<vflux)
			vflux=cap[pred[y]][y];
		y=pred[y];
	}
	y=fiu;
	cap[fiu][n]-=vflux;
	cap[n][fiu]+=vflux;
	while (y!=1)
	{
		cap[pred[y]][y]-=vflux;
		cap[y][pred[y]]+=vflux;
		y=pred[y];
	}
	return vflux;
}
int flux()
{
	int p,u,d,i;
    memset(pred,0,sizeof(pred));
    p=u=1;
    q[p]=1;
    while (p<=u)
	{
		for(i=0;i<a[q[p]].size();i++)
			if (!pred[a[q[p]][i]]&&cap[q[p]][a[q[p]][i]]>0)
			{
				u++;
				q[u]=a[q[p]][i];
				pred[a[q[p]][i]]=q[p];
			}
		p++;
    }
	if (!pred[n])
		return 0;
	d=0;
	for (i=1;i<=nrfi;i++)
	{
		if (pred[b[i]]&&cap[b[i]][n]>0)
		{
			d=1;
			rez+=inc_flux(b[i]);
		}
	}
	return d;
}
int main()
{
	int m,x,y,z,i;
    FILE *in,*out;
    in=fopen("maxflow.in","r");
    out=fopen("maxflow.out","w");
    fscanf(in,"%d%d",&n,&m);
    for (i=1;i<=m;i++)
    {
        fscanf(in,"%d%d%d",&x,&y,&z);
        a[x].pb(y);
        a[y].pb(x);
        cap[x][y]=z;
        if (y==n)
        {
           nrfi++;
           b[nrfi]=x;
        }
    }
    while (flux());
    fprintf(out,"%d\n",rez);
    fclose(in);
    fclose(out);
    return 0;
}