Cod sursa(job #1959347)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 9 aprilie 2017 13:25:27
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <cstdio>
#include <queue>
#include <vector>
 
using namespace std;
 
const int N = 1005;
 
int n, m;
int capacitate[N][N];
int flux[N][N];
vector<int> vecini[N];
int tati[N];
int sol;
 
void citire()
{
    scanf("%d %d", &n, &m);
 
    int tmp1, tmp2, tmp3;
 
    for(int i = 0; i < m; i++)
    {
        scanf("%d %d %d", &tmp1, &tmp2, &tmp3);
 
        vecini[tmp1].push_back(tmp2);
        vecini[tmp2].push_back(tmp1);
 
        capacitate[tmp1][tmp2] = tmp3;
    }
}
 
int bfs()
{
    queue<int> Q;
 
    Q.push(1);
    tati[1] = 1;
 
    while(!Q.empty())
    {
        int x = Q.front();
        int l = vecini[x].size();
 
        Q.pop();
 
        for(int i = 0; i < l; i++)
        {
            if(tati[vecini[x][i]] == 0 && flux[x][vecini[x][i]] != capacitate[x][vecini[x][i]])
            {
                tati[vecini[x][i]] = x;
                Q.push(vecini[x][i]);
            }
        }
    }
 
    if(tati[n] == 0)
    {
        return 0;
    }
 
    return 1;
}
 
void adaugareFlux(int x)
{
    int valMin = capacitate[x][n] - flux[x][n];
    int xx = x;
 
    while(tati[x] != x) 
    {
        int y = tati[x];
 
        int val = capacitate[y][x] - flux[y][x];
 
        if(val < valMin)
        {
            valMin = val;
        }
 
        x = tati[x];
    }
 
    x = xx;
 
    flux[x][n] += valMin;
    flux[n][x] -= valMin;
 
    while(tati[x] != x) 
    {
        int y = tati[x];
 
        flux[x][y] -= valMin;
        flux[y][x] += valMin;
 
        x = tati[x];
    }

	sol += valMin;
}
 
void reinitializare()
{
    for(int i = 0; i <= n; i++)
    {
        tati[i] = 0;
    }
}
 
void solve()
{
    while(bfs() == true)
    {
        int l = vecini[n].size();
 
        for(int i = 0; i < l; i++)
        {
            if(tati[vecini[n][i]] != 0)
            {
                adaugareFlux(vecini[n][i]);
            }
        }
 
        reinitializare();
    }
}
 
void afisare()
{
	printf("%d", sol);
}
 
int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
 
    citire();
    solve();
    afisare();
 
    return 0;
}