Cod sursa(job #1701539)

Utilizator andreitulusAndrei andreitulus Data 13 mai 2016 13:30:58
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <vector>
#include <cstring>
#define NMAX 1024
#define inf 0x3f3f3f3f
 
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
 
int n, m, F[NMAX][NMAX], C[NMAX][NMAX], TT[NMAX], flow, fmin, Q[NMAX], V, viz[NMAX];
vector <int> v[NMAX];

 
int minim(int a, int b)
{
    if (a < b) return a;

    return b;
}



void read()
{
	int i, x, y, z;

	fin >> n >> m;

	for (i = 1; i <= m; i++)
	{
		fin >> x >> y >> z;

		C[x][y] = z;
		v[x].push_back(y);
		v[y].push_back(x);
	}

}


 
int BFS()
{
    int V, nod, i, j;

    Q[0] = 1;
    Q[1] = 1;

    memset(viz, 0, sizeof(viz));

    viz[1] = 1;

    for (i = 1; i <= Q[0]; i++)
    {
        nod = Q[i];

        if (nod == n)
            continue;

        for (j = 0; j < v[nod].size(); j++)
        {
            V = v[nod][j];

            if (viz[V] || F[nod][V] == C[nod][V])
                continue;

            viz[V] = 1;

            TT[V] = nod;

            Q[ ++Q[0] ] = V;
        }
    }
 
    return viz[n];
}




void flux()
{
	int i, j;

	while(BFS())
	{
		flow = 0;

		for (i = 0; i < v[n].size(); i++)
		{
			V = v[n][i];
			TT[n] = V;
	
			if (F[V][n] == C[V][n] || !viz[V])
				continue;

			fmin = inf;

			for (j = n; j != 1; j = TT[j])
			{	
				fmin = minim(fmin, C[ TT[j] ][j] - F[ TT[j] ][j]);
			}

			if (fmin == 0)
				continue;

	
			for (j = n; j != 1; j = TT[j])
			{
				F[ TT[j] ][j] += fmin;
				F[j][ TT[j] ] -= fmin;
			}
			
			flow += fmin;
		}
	}

	fout << flow;

}



 
int main()
{
 	read();

	flux();	
   
	fin.close();
	fout.close();

	return 0;
}