Pagini recente » Cod sursa (job #1638695) | Cod sursa (job #1983010) | Cod sursa (job #1199776) | Cod sursa (job #68630) | Cod sursa (job #2959826)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define MAXN 1001
#define INF 999999
using namespace std;
int capacity[MAXN][MAXN];
int capacityin[MAXN][MAXN];
int n;
vector<vector<int>>adj;
int bfs(int s,int f,vector<int>&parent){
fill(parent.begin(),parent.end(),-1);
int tm=0;
queue<pair<int,int>> q;
parent[s]=-2;
q.push({s,INF});
while(!q.empty()){
int cur=q.front().first;
int flow=q.front().second;
q.pop();
for(auto el:adj[cur]){
if(parent[el]==-1 && capacity[cur][el]){
parent[el]=cur;
int new_flow=min(flow,capacity[cur][el]);
if(el==f)
return new_flow;
q.push({el,new_flow});
}
else if(parent[el]==-1 && capacity[cur][el]==0)
tm+=capacityin[cur][el];
}
}
return 0;
}
int max_flow(int source,int sink){
int maxflow=0;
vector<int>parent(n+1);
int flow;
while(flow=bfs(source,sink,parent)){
maxflow+=flow;
int cur=sink;
while(cur!=source){
int prev=parent[cur];
capacity[cur][prev]+=flow;
capacity[prev][cur]-=flow;
cur=prev;
}
}
return maxflow;
}
int main() {
int m,u,v,c,i,mx;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
cin>>n>>m;
adj.resize(n+1);
for(i=1;i<=m;i++){
cin>>u>>v>>c;
capacity[u][v]=c;
capacityin[u][v]=c;
adj[u].push_back(v);
adj[v].push_back(u);
}
mx=max_flow(1,n);
cout<<mx;
cin.close();
cout.close();
}