网络流二·最大流最小割定理 HihoCoder - 1378
2017-11-03 14:33
441 查看
传送门
问题关键是求是点的最小割集点,实质上个只要在增广完毕后的残量网络中,从源点出发做一次bfs即可,即可把所有的s割点找出
问题关键是求是点的最小割集点,实质上个只要在增广完毕后的残量网络中,从源点出发做一次bfs即可,即可把所有的s割点找出
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<queue> #define INF 0x3f3f3f3f using namespace std; const int maxn=505; const int maxx=40005;//题目来自于hdu 3572 int edge; int to[maxx],flow[maxx],nex[maxx]; int head[maxn]; void addEdge(int v,int u,int cap) { to[edge]=u,flow[edge]=cap,nex[edge]=head[v],head[v]=edge++; to[edge]=v,flow[edge]=0,nex[edge]=head[u],head[u]=edge++; } int vis[maxn]; int pre[maxn]; bool bfs(int s,int e) { queue<int> que; pre[s]=-1; memset(vis,-1,sizeof(vis)); que.push(s); vis[s]=0; while(!que.empty()) { int u=que.front(); que.pop(); for(int i=head[u];~i;i=nex[i]) { int v=to[i]; if(vis[v]==-1&&flow[i]) { vis[v]=vis[u]+1; if(v==e) return true; que.push(v); } } } return false; } int dfs(int s,int t,int f) { if(s==t||!f) return f; int r=0; for(int i=head[s];~i;i=nex[i]) { int v=to[i]; if(vis[v]==vis[s]+1&&flow[i]) { int d=dfs(v,t,min(f,flow[i])); if(d>0) { flow[i]-=d; flow[i^1]+=d; r+=d; f-=d; if(!f) break; } } } if(!r) vis[s]=INF; return r; } vector<int> ans; int bfs()//用来找割s割集的点 { queue<int> que; memset(vis,0,sizeof(vis)); que.push(1); vis[1]=1; while(!que.empty()) { int u=que.front(); que.pop(); ans.push_back(u); for(int i=head[u];~i;i=nex[i]) { int v=to[i]; if(vis[v]||!flow[i]) continue; que.push(v); vis[v]=1; } } //printf("\n"); } int maxFlow(int s ,int e)//然后直接调用这个即可 { int ans=0; while(bfs(s,e)) ans+=dfs(s,e,INF); return ans; } void init()//记得每次使用前初始化 { memset(head,-1,sizeof(head)); edge=0; } int main() { int n,m; scanf("%d%d",&n,&m); int u,v,w; init(); ans.clear(); while(m--) { scanf("%d%d%d",&u,&v,&w); addEdge(u,v,w); } int cut=maxFlow(1,n); bfs(); printf("%d %d\n",cut,ans.size()); for(int i=0;i<ans.size();i++) printf("%d ",ans[i]); printf("\n"); return 0; }
相关文章推荐
- 【hihocoder 1378】网络流二·最大流最小割定理
- hihocoder 1378 : 网络流二·最大流最小割定理
- [HihoCoder1378]网络流二·最大流最小割定理
- hihocoder 1378 网络流二·最大流最小割定理
- hihocoder1378 网络流之最大流最小割
- hihocoder 网络流二·最大流最小割定理
- hihocode#1378 : 网络流二·最大流最小割定理(最大流求最小割集)
- UVA10480 Sabotage (网络流,最小割,ISAP算法,最大流最小割定理)
- hihocoder 1378(有向图求最小割集)
- [HihoCoder1369]网络流一·Ford-Fulkerson算法
- 网络流模版(ISAP)/最大流最小割定理 poj 3469
- 【hihocoder 1369】网络流一·Ford-Fulkerson算法
- 网络流、费用流、最大流最小割定理……
- 网络流、费用流、最大流最小割定理……
- hiho一下 #1378 : 网络流二·最大流最小割定理 【最大流及S集合】
- hihocoder-1393 二分图的多重匹配(网络流做法)
- [HihoCoder1393]网络流三·二分图多重匹配
- 网络流二·最大流最小割定理
- 【hihocoder 1424】 Asa's Chess Problem(有源汇上下界网络流)
- hihocoder1398 网络流五之最大权闭合子图