Pagini recente » Cod sursa (job #1825038) | Cod sursa (job #2595391) | Cod sursa (job #1126366) | Cod sursa (job #2836517) | Cod sursa (job #988786)
Cod sursa(job #988786)
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#define sd (v[i][j])
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m;
vector<int> v[1001];
int a[1001][1001];
bool bfs(int parent[],int son[]){
queue<int> q;
q.push(1);
bool ok[1001]={};
ok[1]=1;
son[0]=0;
while(!q.empty()){
int i=q.front();
q.pop();
for(unsigned j=0;j<v[i].size();j++){
if(!ok[sd] && a[i][sd] > 0 && sd!=n){
ok[sd]=1;
parent[sd]=i;
q.push(sd);
}
if(sd==n && a[i][sd] > 0){
son[++son[0]]=i;
ok[n]=1;
}
}
}
return ok[n];
}
int max_flow(){
int parent[1001],son[1001];
int s=0;
while(bfs(parent,son)){
for(int t=1;t<=son[0];t++){
int ds=son[t];
int flo=a[ds][n];
int u=ds,ve;
while(u!=1){
ve=u;
u=parent[u];
flo=min(flo,a[u][ve]);
}
u=ds;
while(u!=1){
ve=u;
u=parent[u];
a[u][ve]-=flo;
a[ve][u]+=flo;
}
a[ds][n]-=flo;
a[n][ds]+=flo;
s+=flo;
}
}
return s;
}
int main()
{
f>>n>>m;
for(int i=1;i<=m;i++){
int x,y,flo;
f>>x>>y>>flo;
a[x][y]=flo;
v[x].push_back(y);
v[y].push_back(x);
}
g<<max_flow();
return 0;
}