Mai intai trebuie sa te autentifici.
Cod sursa(job #1958217)
Utilizator | Data | 8 aprilie 2017 09:45:26 | |
---|---|---|---|
Problema | Flux maxim | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.84 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];
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;
capacitate[tmp2][tmp1] = 0;
flux[tmp1][tmp2] = 0;
flux[tmp2][tmp1] = 0;
}
}
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];
}
}
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()
{
int l = vecini[n].size();
int rezultat = 0;
for(int i = 0; i < l; i++)
{
rezultat += flux[vecini[n][i]][n];
}
printf("%d", rezultat);
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
citire();
solve();
afisare();
return 0;
}