luogo_3376 网络最大流

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010
#define INF 100000000
struct Edge{int from,to,cap,flow;};
vector<Edge> edges;
vector<int> G[MAXN];
int n,m,s,t,cur[MAXN],d[MAXN],u,v,w;
bool vis[MAXN];
void addedge(int from,int to,int cap){
edges.push_back((Edge){from,to,cap,0});
edges.push_back((Edge){to,from,0,0});
int x=edges.size();
G[from].push_back(x-2);
G[to].push_back(x-1);
}
bool bfs(){
memset(vis,0,sizeof(vis));
queue<int> Q;
Q.push(s); vis[s]=1; d[s]=0;
while(!Q.empty()){
int x=Q.front(); Q.pop();
for(int i=0;i<G[x].size();i++){
Edge& e=edges[G[x][i]];
if(!vis[e.to] && e.cap>e.flow){
vis[e.to]=1;
d[e.to]=d[x]+1;
Q.push(e.to);
}
}
}
return vis[t];
}
int dfs(int x,int a){
if(x==t || a==0)return a;
int flow=0,f;
for(int& i=cur[x];i<G[x].size();i++){
Edge& e=edges[G[x][i]];
if(d[e.to]==d[x]+1 && (f=dfs(e.to,min(a,e.cap-e.flow)))>0){
e.flow+=f;
edges[G[x][i]^1].flow-=f;
flow+=f;
a-=f;
if(a==0)break;
}
}
return flow;
}
int Dinic(){
int flow=0;
while(bfs()){
memset(cur,0,sizeof(cur));
flow+=dfs(s,INF);
}
return flow;
}
int main(){
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
cout<<Dinic()<<endl;
return 0;
}
posted @ 2017-09-09 13:39  wqtnb_tql_qwq_%%%  阅读(146)  评论(0编辑  收藏  举报