UVA - 10480 Sabotage 输出最小割方案
题目链接
https://vjudge.net/problem/UVA-10480
题意
无向图求最小割的方案
思路
最小割部分是模版,问题在于最小割的方案如何输出。
首先根据最小割最大流定理,我们跑一遍Dinic就可以求出最小割,这时残量网络中s和t已经不再联通了。我们可以从s开始跑一遍dfs,沿着所有还未满流的边搜索,所有能到达的节点就是和s在同一集合的节点。之后我们遍历每一条边,将边起点终点不在同一集合内的输出即可。
注意需要修改下链式前向星,每一个edge结构体内存一下起点。
附一篇最小割相关拓展的优质博客:https://www.cnblogs.com/lyttt/p/11817977.html
代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<string>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
using namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const int maxn=1010;const int maxe=1010;int head[maxn],cnt;struct Edge{int u;int v;int w;int next;}edge[maxe];int n,m,s,t;ll maxflow;int deep[maxn];int now[maxe];bool s_or_t[maxn];//0代表和t相连,1是和s相连 void init(){memset(head,-1,sizeof(head));memset(s_or_t,0,sizeof s_or_t);cnt=0;maxflow=0; return ; }void add(int u,int v,int w){// cout<<u<<" "<<v<<" "<<w<<endl;edge[cnt].u=u;edge[cnt].v=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;}inline bool bfs(){memset(deep,0x3f,sizeof(deep));queue<int>q;q.push(s);deep[s] = 0;now[s] = head[s];while(q.size()){int x = q.front();q.pop();for(int i=head[x];i!=-1;i=edge[i].next){int y=edge[i].v;if(edge[i].w>0&&deep[y]==inf){q.push(y);now[y]=head[y];deep[y]=deep[x]+1;if(y==t) return 1;}}}return 0;}ll dfs(int x,int flow){if(x==t) return flow;ll ans = 0,k,i;for(i=now[x];i!=-1&&flow;i=edge[i].next){now[x]=i;int y=edge[i].v;if(edge[i].w>0&&(deep[y]==deep[x]+1)){k=dfs(y,min(flow,edge[i].w));if(!k) deep[y]=inf;edge[i].w-=k;edge[i^1].w+=k;ans+=k;flow-=k;}}return ans;} void dinic(){while(bfs())maxflow+=dfs(s,inf);}//在残量网络中跑dfs void output_dfs(int u){if(s_or_t[u])return ;else{s_or_t[u]=1;} for(int i=head[u];~i;i=edge[i].next)if(edge[i].w>0)//只能通过还有余量的边 output_dfs(edge[i].v);}int main(){ IOSwhile(cin>>n>>m){if(!n&&!m)break;init();while(m--){int u,v,w;cin>>u>>v>>w;add(u,v,w);add(v,u,w);} s=1,t=2;dinic();output_dfs(s);for(int i=0;i<cnt;i+=2){int u=edge[i].u,v=edge[i].v;if(s_or_t[u]!=s_or_t[v])cout<<u<<" "<<v<<endl;}cout<<endl;}return 0;}
UVA - 10480 Sabotage 输出最小割方案相关推荐
- UVA - 10480 Sabotage 最小割,输出割法
UVA - 10480 Sabotage 题意:现在有n个城市,m条路,现在要把整个图分成2部分,编号1,2的城市分成在一部分中,拆开每条路都需要花费,现在问达成目标的花费最少要隔开那几条路. 题解: ...
- 【网络流24题】B、太空飞行计划问题(最大权闭合图转最小割、最小割方案输出)
整理的算法模板合集: ACM模板 B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] P2762 太空飞行计划问题 [问题分析] 最大权闭合图问题,可以转化成最小割问题, ...
- UVA - 10480 Sabotage(最小割-最大流+输出割边)
题目链接:点击查看 题目大意:给出一张无向图,1为起点,2为终点,删除每条边都需要权值wi,题目需要求将起点与终点分割为两个部分的最小花费,并且输出方案 题目分析:如果不让输出方案的话就是一个裸的最大 ...
- UVA 10480 - Sabotage (最大流)
这道题的意思要把一个图分成两部分,要把点1和点2分开.隔断每条边都有一个花费,求最小花费的情况下,应该切断那些边. 这题很明显是最小割,也就是最大流.把1当成源点,2当成汇点. 问题是要求最小割应该隔 ...
- UVA 10480 Sabotage
最小割+输出方案 #include<cstdio> #include<cstring> #include<string> #include<cmath> ...
- UVA-10480 Sabotage(最大流最小割定理+输出路径)
题目链接:UVA-10480 Sabotage The regime of a small but wealthy dictatorship has been abruptly overthrown ...
- 模板 - 最小割(常见最小割题型技巧总结)
整理的算法模板合集: ACM模板 目录 一.集合划分模型 二.点边转化 三.最小割的可行边与必须边 四.二分图的可行边和必须边 五.平面图最小割 六.最小割的一些小技巧 1.记录划分方案 2.求割边数 ...
- bzoj 1934 最小割
收获: 1.流量为0的边可以不加入. 2.最小割方案要与决策方案对应. 1 #include <cstdio> 2 #include <cmath> 3 #include &l ...
- Sabotage UVA - 10480 (最小割+求最小割去掉的具体边+ISAP)
传送门 题意:给定n个点,m条带权无向边,源点s=1,汇点t=2.去掉一些边之后使s,t不连通,求去掉的这些边(而且还要满足去掉的边权和是所有答案中最小的--最小割). n<=50,m<= ...
最新文章
- Linux 用户行为日志记录
- ASan(Linux),gcc4.8以上版本自带的内存检查工具
- 使用docker搭建Hadoop
- 如何使用python批量压缩图片_Python实现批量压缩图片
- Windows下给SourceTree配置外部比较工具BeyondCompare
- js 逆向分析的神器 --- v_jstools
- Flutter轮播图
- iOS 内存管理arc
- quartus仿真17:T触发器的时序逻辑电路
- hibernate3连oracle的各种坑。。
- java jdk生成安卓app证书
- 机房(计算机室)管理制度,湖南石油化工职业技术学院-信息资源中心-管理制度-计算机机房管理制度...
- vue高德多条路线规划+带途径节点多组多个maker text标签创建+各路线颜色区别
- macbook pro怎么养小宠物?macbook pro养宠物设置方法
- Nature封面:基因突变才是衰老的罪魁祸首?体细胞突变越快,寿命越短
- Python正则表达式中的‘r‘
- html文档是哪个版本,HTML 简介, 版本和文档类型声明
- 7-158 判断4和7的倍数
- 男生可以把女生的裤袜当秋裤穿吗?
- LaTeX中定义新命令和环境