Pagini recente » Monitorul de evaluare | Cod sursa (job #929325) | Cod sursa (job #1667218) | Cod sursa (job #2986891) | Cod sursa (job #3305717)
#include <fstream>
#include <deque>
#include <vector>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
int cost[1001][1001];
int flow[1001][1001];
int dist[1001],n;
vector<int> v[1001];
deque<int> q;
bool bfs(int in,int dest){
int i,nod;
for(i=1;i<=n;i++){
dist[i]=1e9;
}
dist[in]=0;q.clear();q.push_back(in);
while(!q.empty()){
nod=q.front();q.pop_front();
for(auto it:v[nod]){///printf("%d ",nod);
if(cost[nod][it]>flow[nod][it] && dist[it]>dist[nod]+1){
dist[it]=dist[nod]+1;
q.push_back(it);
}
}
}
if(dist[dest]!=1e9) return 1;
return 0;
}
int calc(int nod,int dest,int max1){
if(!max1) return 0;
if(nod==dest) return max1;
int sum=0,cur;
for(auto it:v[nod]){
if(dist[it]!=dist[nod]+1) continue;
cur=calc(it,dest,min(max1-sum,cost[nod][it]-flow[nod][it]));
flow[nod][it]+=cur;
flow[it][nod]-=cur;
sum+=cur;
}
return sum;
}
int main()
{
int m,rasp=0,i,a,b,c;
cin>>n>>m;
for(i=1;i<=m;i++){
cin>>a>>b>>c;
v[a].push_back(b);
v[b].push_back(a);
cost[a][b]+=c;
}
while(bfs(1,n)){
rasp+=calc(1,n,1e9);
}
cout<<rasp;
return 0;
}