Mai intai trebuie sa te autentifici.
Cod sursa(job #1402368)
Utilizator | Data | 26 martie 2015 15:31:20 | |
---|---|---|---|
Problema | Flux maxim | Scor | 50 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.72 kb |
#include<fstream>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x3f3f3f3f
#define N 1010
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,i,x,mini,y,viz[N],t[N],cap[N][N],fl[N][N];
queue<int>q;
vector<int>v[N];
inline bool bfs(){
memset(viz, 0, sizeof(viz));
q.push(1);
viz[1] = 1;
while(!q.empty())
{
x = q.front();
q.pop();
if(x == n)
continue;
for(vector<int>::iterator it = v[x].begin(); it != v[x].end(); ++it)
if(cap[x][*it] > fl[x][*it] && !viz[*it])
{
t[*it] = x;
viz[*it] = 1;
q.push(*it);
}
}
return viz[n];
}
inline int Max_Flow(){
int Flux = 0;
while(bfs())
{
for(i = 1; i < n; ++i)
if(cap[i][n] > fl[i][n] && viz[i])
{
t[n] = i;
x = n;
mini = INF;
while(x != 1)
{
mini = min(mini, cap[t[x]][x] - fl[t[x]][x]);
x = t[x];
}
if(!mini)
continue;
Flux += mini;
x = n;
while(x != 1)
{
fl[t[x]][x] += mini;
fl[x][t[x]] -= mini;
x = t[x];
}
}
}
return Flux;
}
int main()
{
f >> n >> m;
for(i = 1; i <= m; ++i)
{
f >> x >> y;
f >> cap[x][y];
v[x].push_back(y);
}
g << Max_Flow() << '\n';
return 0;
}