Pagini recente » Cod sursa (job #2721555) | Cod sursa (job #1224402) | Cod sursa (job #1822447) | Cod sursa (job #1224264) | Cod sursa (job #2485916)
#include <bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector <int> G[1005];
int c[1005][1005],F[1005][1005],t[1005];
int n,m,x,y,cap;
void load()
{
f>>n>>m;
for(int i=1; i<=m; ++i)
{
f>>x>>y>>cap;
c[x][y]=cap;
G[x].push_back(y);
G[y].push_back(x);
F[x][y]=F[y][x]=0;
}
}
bool bfs(int s, int d)
{
for(int i=1; i<=n; ++i)t[i]=-1;
t[s]=0;
queue<int>Q;
Q.push(s);
while(!Q.empty())
{
int node=Q.front();
Q.pop();
for(auto it:G[node])
if(t[it]==-1 && c[node][it]>F[node][it])
{
t[it]=node;
if(it==d)return true;
Q.push(it);
}
}
return false;
}
int MaxFlow(int s, int d)
{
int flux=0;
while(bfs(s,d))
{
for(auto it: G[d])
{
if(t[it]!=-1)
{
int Add=c[it][d]-F[it][d];
int node=it,dad=0;
while(node!=s)
{
dad=t[node];
Add=min(Add,c[dad][node]-F[dad][node]);
node=dad;
}
F[it][d]+=Add;
F[d][it]-=Add;
flux+=Add;
node=it;
while(node!=s)
{
dad=t[node];
F[node][dad]-=Add;
F[dad][node]+=Add;
node=dad;
}
}
}
}
return flux;
}
int main()
{
load();
g<<MaxFlow(1,n)<<'\n';
return 0;
}