Pagini recente » Cod sursa (job #813882) | Rating Gabi Dumitru (snoopye1923) | Cod sursa (job #2384931) | Cod sursa (job #2188225) | Cod sursa (job #2154868)
#include <fstream>
#include <cstdio>
#include <queue>
#include <cstring>
#define Nmax 1002
#define pii pair<int,int>
#define inf 1e9
using namespace std;
FILE *f = fopen("maxflow.in","r");
ofstream g("maxflow.out");
int n,m,x,y,c,S = 1,D,mn[Nmax],viz[Nmax];
vector<pii> E;
vector<int> G[Nmax],G2[Nmax];
queue<int> Q;
bool bfs(){
memset(mn,0,sizeof(mn));
for (int i=1;i<=n;i++) G2[i].clear();
while (!Q.empty()) Q.pop();
Q.push(S);
mn[S] = 1;
while (!Q.empty()){
if (Q.front()==D) return 1;
for (auto it : G[Q.front()]){
if (!E[it].second) continue;
if (!mn[E[it].first]){
Q.push(E[it].first);
mn[E[it].first] = mn[Q.front()]+1;
}
if (mn[E[it].first]==mn[Q.front()]+1){
G2[Q.front()].push_back(it);
}
}
Q.pop();
}
return 0;
}
int dfs(int nod,int cap){
int now = 0;
if (nod==D || !cap) return cap;
for (auto it : G2[nod]){
if (viz[E[it].first]) continue;
int flow = dfs(E[it].first, min(cap-now,E[it].second));
E[it].second -= flow;
E[it^1].second += flow;
now += flow;
}
return now;
}
int main()
{
fscanf(f,"%d%d",&n,&m);
D = n;
for (int i=1;i<=m;i++){
fscanf(f,"%d%d%d",&x,&y,&c);
G[x].push_back(E.size());
E.push_back({y,c});
G[y].push_back(E.size());
E.push_back({x,0});
}
int ans = 0;
while (bfs()){
ans += dfs(S,inf);
}
g<<ans;
return 0;
}