Pagini recente » Cod sursa (job #1336143) | Cod sursa (job #2126554) | Cod sursa (job #2722268) | Cod sursa (job #2885143) | Cod sursa (job #2469899)
///Dinitz O(n*n*m)
//#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
queue <int> q;
struct nod{
vector<int> adj;
}graf[1005];
struct muchie{
int cap,u,v,flux;
};
vector<muchie> E;
int dist[1005],n,m,flux=0;
int upto[1005],s,t,cnt=0;
bool bfs(){
for(int i=1;i<=n;i++)
dist[i]=-1;
q.push(s);dist[s]=0;
while(q.empty()==false){
int cur=q.front();
q.pop();
for(int i=0;i<graf[cur].adj.size();i++){
int id=graf[cur].adj[i];
int j=E[id].v;
if(dist[j]==-1 and E[id].flux<E[id].cap){
q.push(j);
dist[j]=dist[cur]+1;
}
}
}
if(dist[t]==-1){
return false;
}
return true;
}
int dfs(int nod,int mincap){
if(mincap==0 or nod==t){
return mincap;
}
while(upto[nod]<graf[nod].adj.size()){
int i=graf[nod].adj[upto[nod]];
int j=E[i].v;
if(dist[nod]==dist[j]-1){
int aug=dfs(j,min(mincap,E[i].cap-E[i].flux));
if(aug>0){
E[i].flux+=aug;
if(i%2==0){
E[i+1].flux-=aug;
}
else
E[i-1].flux-=aug;
return aug;
}
}
upto[nod]++;
}
return 0;
}
int Dinitz(){
while(1){
for(int i=1;i<=n;i++)
dist[i]=-1;
if(bfs()==false){
break;
}
while(1){
for(int i=1;i<=n;i++)
upto[i]=0;
int currflux=dfs(1,2000000000);
if(currflux==0){
break;
}
flux+=currflux;
}
}
return flux;
}
void add_muchie(int u,int v,int cap){
muchie E1,E2;
E1.u=u;
E1.v=v;
E1.cap=cap;
E1.flux=0;
E2.u=v;
E2.v=u;
E2.cap=0;
E2.flux=0;
graf[u].adj.push_back(cnt++);
E.push_back(E1);
graf[v].adj.push_back(cnt++);
E.push_back(E2);
}
int main()
{
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
cin>>n>>m;
s=1;
t=n;
int x,y,c;
for(int i=1;i<=m;i++){
cin>>x>>y>>c;
add_muchie(x,y,c);
}
cout<<Dinitz();
return 0;
}