Cod sursa(job #702685)

Utilizator amerigohi lili amerigo Data 2 martie 2012 07:52:52
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
//#include <iostream>
#include <vector>

using namespace std;

ifstream k("maxflow.in");
ofstream g("maxflow.out");

const int nbmax=1001;
int n,m,x,y,c,ok=1;
vector<int> path,a[nbmax];
struct tpath {int flux,cap;} f[nbmax][nbmax];
int chk[nbmax];
int abs(int x){return (x>0?x:-x);}
int sgn(int x){return x/abs(x);}
int dfs(int x)
{
    if(x==n) return 1;
	chk[x]=ok;
	int s=a[x].size();
	for(int i=0;i<s;i++)
		if(chk[abs(a[x][i])]!=ok and f[x][abs(a[x][i])].flux<f[x][abs(a[x][i])].cap)
			if(dfs(abs(a[x][i]))==1)
			{
				path.push_back(a[x][i]);
				return 1;
			}
    return 0;
}

int main()
{
    k>>n>>m;
    for(int i=1; i<=m; i++)
    {
        k>>x>>y>>c;
        a[x].push_back(y);
		a[y].push_back(-x);
		f[x][y].cap=c;
    }
	while(dfs(1)==1)
	{
		path.push_back(1);
		int s=path.size();
		int minn=100001;
		for(int i=s-2;i>=0;i--)
			if(minn>f[path[i+1]][path[i]].cap-f[path[i+1]][path[i]].flux)
				minn=f[path[i+1]][path[i]].cap-f[path[i+1]][path[i]].flux;
		for(int i=s-2;i>=0;i--)
			f[path[i+1]][path[i]].flux+=(minn*sgn(path[i+1]));
		ok++;
		path.resize(0);
	}
	int s=a[1].size();
	int sol=0;
    for(int i=0;i<s;i++)
        sol+=f[1][a[1][i]].flux;
    g<<sol;
    k.close();
    g.close();
    return 0;
}