Pagini recente » Cod sursa (job #2961624) | Cod sursa (job #479151) | Cod sursa (job #2982329) | Cod sursa (job #117127) | Cod sursa (job #931507)
Cod sursa(job #931507)
#include<iostream>
#include<vector>
#include<fstream>
#include<queue>
using namespace std;
#define INF 100000000
int search(int n, vector<int> v[], int p[]);
int main(){
int n,m;
ifstream cinr("maxflow.in");
cinr >> n >> m;
vector<int> v[n+1];
int p[n+1];
for(int i=0; i<m; i++){
int a,b,c;
cinr >> a >> b >> c;
v[a].push_back(b);
v[a].push_back(c);
v[a].push_back(c);
} cinr.close();
int min=search(n,v,p);
while(p[n]!=0){
int i=n;
while(i!=1){
int r; r=p[i];
for(int j=0; j<v[r].size(); j+=3)
if(v[r][j]==i){
v[r][j+2]-=min;
break;
}
for(int j=0; j<v[i].size(); j+=3)
if(v[i][j]==r){
v[i][j+2]+=min;
break;
}
i=r;
}
min=search(n,v,p);
}
int sum=0;
for(int i=0; i<v[1].size(); i+=3){
sum+=v[1][i+1]-v[1][i+2];
}
ofstream cour("maxflow.out");
cour << sum;
cour.close();
}
int search(int n, vector<int> v[], int p[]){
bool vis[n+1];
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++) p[i]=0;
queue<int> q;
q.push(1); q.push(INF);
int min;
while(!q.empty()){
int r;
r=q.front(); q.pop();
min=q.front(); q.pop();
vis[r]=true;
for(int i=0; i<v[r].size(); i+=3){
if(!vis[v[r][i]] && v[r][i+2]!=0){
p[v[r][i]]=r;
if(v[r][i+2]<min) min=v[r][i+2];
if(v[r][i]==n) return min;
q.push(v[r][i]); q.push(min);
}
}
}
return min;
}