Mai intai trebuie sa te autentifici.
Cod sursa(job #1553089)
Utilizator | Data | 19 decembrie 2015 11:26:51 | |
---|---|---|---|
Problema | Flux maxim | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.64 kb |
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
#define mk(a,b) make_pair(a,b)
vector<pair<int,int>> G[1001];
deque<int> q;
int N, M,a,b,c,i,T=0;
int viz[1001];
int from[1001], it[1001], min_val[1001],O[1001];
int BFS(int x)
{
q.push_back(x);
viz[x] = T+1;
min_val[1] = 1 << 30;
int i;
while (q.size())
{
x = q.front();
q.pop_front();
for (i = 0; i < G[x].size();++i)
if (viz[G[x][i].first]<=T && G[x][i].second>0)
{
q.push_back(G[x][i].first);
viz[G[x][i].first] = T+1;
from[G[x][i].first] = x;
it[G[x][i].first] = i;
min_val[G[x][i].first] = min(min_val[x], G[x][i].second);
if (G[x][i].first == N)
{
q.clear();
return 1;
}
}
}
return 0;
}
void update(int x)
{
int min_value = min_val[x];
while (from[x])
{
if (G[from[x]][it[x]].second - min_value >= 0)
{
G[from[x]][it[x]].second = G[from[x]][it[x]].second - min_value;
G[x][it[x]].second = G[x][it[x]].second + min_value;
}
else
{
G[from[x]][it[x]].second = G[from[x]][it[x]].second + min_value;
G[x][it[x]].second = G[x][it[x]].second - min_value;
}
x = from[x];
}
}
void Edmond()
{
while (BFS(1))
{
update(N);
++T;
}
}
int main()
{
in >> N >> M;
for (i = 1; i <= M; ++i)
{
in >> a >> b>>c;
G[a].push_back(mk(b, c));
G[b].push_back(mk(a, 0));
}
for (i = 0; i < G[1].size(); ++i)
O[i] = G[1][i].second;
Edmond();
int s = 0;
for (i = 0; i < G[1].size(); ++i)
s += O[i]-G[1][i].second;
out << s;
return 0;
}