Pagini recente » Cod sursa (job #2706939) | Cod sursa (job #52199) | Cod sursa (job #2633701) | Cod sursa (job #2636809) | Cod sursa (job #2063654)
#include<fstream>
#include<list>
#include<bitset>
#include<climits>
#include<deque>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX=1005,INF=INT_MAX;
list<int>g[NMAX];
bitset<NMAX>vis;
int capacity[NMAX][NMAX],flow[NMAX][NMAX],tree[NMAX],n,m,min_flow;
void read_data(){
int from,to,c;
fin>>n>>m;
while(m--){
fin>>from>>to>>c;
g[from].push_back(to);
g[to].push_back(from);
capacity[from][to]=c;
}
}
bool BFS(){
deque<int>d;
d.push_back(1);
vis[1]=true;
int node;
list<int>::iterator it;
while(!d.empty()){
node=d.front();
d.pop_front();
if(node==n)
d.clear();
else{
for(it=g[node].begin();it!=g[node].end();++it)
if(!vis[*it] and capacity[node][*it]!=flow[node][*it]){
tree[*it]=node;
d.push_back(*it);
vis[*it]=true;
}
}
}
return vis[n];
}
void get_min_flow(){
int node;
min_flow=INF;
for(node=n;node!=1;node=tree[node])
min_flow=min(min_flow,capacity[tree[node]][node]-flow[tree[node]][node]);
}
void change_flow(){
int node;
for(node=n;node!=1;node=tree[node]){
flow[tree[node]][node]+=min_flow;
flow[node][tree[node]]-=min_flow;
}
}
int max_flow(){
int flow=0;
while(BFS()){
get_min_flow();
flow+=min_flow;
change_flow();
vis.reset();
}
return flow;
}
int main(){
read_data();
fout<<max_flow();
}