Pagini recente » Cod sursa (job #847836) | Cod sursa (job #1009270) | Cod sursa (job #2779295) | Cod sursa (job #1589307) | Cod sursa (job #2204933)
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <set>
#include <queue>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n, m;
vector<list<int>> graf(1004);
int F[1005][1005], C[1005][1005];
vector<int> t(1004);
int BFS ()
{
set <int> viz;
queue <int> p;
int x=1;
p.push(x);
viz.insert(x);
t[1]=0;
while(!p.empty() && !viz.count(n))
{
for(int i=1;i<=n;i++)
{
if(C[x][i] != F[x][i] && !viz.count(i))
{
p.push(i);
viz.insert(i);
t[i]=x;
}
}
p.pop();
x=p.front();
}
if(!viz.count(n))
return 0;
int minim=INT_MAX;
int i=n;
while(t[i]!=0)
{
if(C[t[i]][i]-F[t[i]][i]<minim)
minim=C[t[i]][i]-F[t[i]][i];
i=t[i];
}
i=n;
while(t[i]!=0)
{
F[t[i]][i]+=minim;
F[i][t[i]]-=minim;
i=t[i];
}
return minim;
}
int main()
{
int i;
f>>n>>m;
for(i=1;i<=m;i++)
{
int x, y, c;
f>>x>>y>>c;
graf[x].push_back(y);
graf[y].push_back(x);
C[x][y]=c;
}
f.close();
///1 nodul sursa
///n nodul destinatie
int flux=0;
while(true)
{
int ok=BFS();
if(ok==0)
break;
flux+=ok;
}
g<<flux;
g.close();
}