题目分析:网络流求最小割的模板题,难点在于求出最小割集。求出最小割集的方法是在求网络流之后跑一遍BFS对能够跑到的点进行标记(能跑到表示该点与起点处于同一割点集),然后遍历边,则最小割边即于起点被标记,终点没被标记的边,去重依次输出即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<vector>
#include<iomanip>
#include<queue>
#include<map>
#include<stack>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int maxn=550;
const LL INF = 100000000000000;
int n,m;
struct edge
{LL from,to,cap,flow;edge(LL f,LL t,LL c,LL fl):from(f),to(t),cap(c),flow(fl){}
};
struct Dinic
{int n,m,s,t;vector<edge> edges;vector<int> G[maxn];bool vis[maxn];int d[maxn];int cur[maxn];void init(int n,int s,int t,int m){this->n=n,this->s=s,this->t=t,this->m=m;edges.clear();for(int i=1;i<=n;i++)G[i].clear();}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 m=edges.size();G[from].push_back(m-2);G[to].push_back(m-1);}bool bfs(){memset(vis,0,sizeof(vis));queue<int> Q;Q.push(s);d[s]=0;vis[s]=1;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];}LL dfs(LL x,LL a){if(x==t||a==0)return a;LL flow=0,f;for(int &i=cur[x];i<G[x].size();i++){edge& e =edges[G[x][i]];if(d[x]+1==d[e.to]&&(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;}LL Maxflow(){LL flow=0;while(bfs()){memset(cur,0,sizeof(cur));flow+=dfs(s,INF);}return flow;}void GetEdge(){memset(vis,0,sizeof(vis));queue<int> Q;Q.push(s);vis[s]=1;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;Q.push(e.to);}}}int Map[maxn][maxn];memset(Map,0,sizeof(Map));for(int i=0;i<edges.size();i++){edge e =edges[i];if(vis[e.from]&&!vis[e.to]&&!Map[e.from][e.to]){Map[e.from][e.to]=1;printf("%lld %lld\n",e.from,e.to);}}printf("\n");}
}DC;
int main()
{while(scanf("%d%d",&n,&m)!=EOF){if(n==0&&m==0)break;DC.init(n,1,2,m);for(int i=0;i<m;i++){LL a,b,c;scanf("%lld%lld%lld",&a,&b,&c);DC.addedge(a,b,c);DC.addedge(b,a,c);}DC.Maxflow();DC.GetEdge();}return 0;
}

UVA-10480 Sabotage相关推荐

  1. UVA - 10480 Sabotage 最小割,输出割法

    UVA - 10480 Sabotage 题意:现在有n个城市,m条路,现在要把整个图分成2部分,编号1,2的城市分成在一部分中,拆开每条路都需要花费,现在问达成目标的花费最少要隔开那几条路. 题解: ...

  2. UVA - 10480 Sabotage(最小割-最大流+输出割边)

    题目链接:点击查看 题目大意:给出一张无向图,1为起点,2为终点,删除每条边都需要权值wi,题目需要求将起点与终点分割为两个部分的最小花费,并且输出方案 题目分析:如果不让输出方案的话就是一个裸的最大 ...

  3. UVA - 10480 Sabotage 输出最小割方案

    题目链接 https://vjudge.net/problem/UVA-10480 题意 无向图求最小割的方案 思路 最小割部分是模版,问题在于最小割的方案如何输出. 首先根据最小割最大流定理,我们跑 ...

  4. UVA 10480 - Sabotage (最大流)

    这道题的意思要把一个图分成两部分,要把点1和点2分开.隔断每条边都有一个花费,求最小花费的情况下,应该切断那些边. 这题很明显是最小割,也就是最大流.把1当成源点,2当成汇点. 问题是要求最小割应该隔 ...

  5. UVA 10480 Sabotage

    最小割+输出方案 #include<cstdio> #include<cstring> #include<string> #include<cmath> ...

  6. Sabotage UVA - 10480 (最小割+求最小割去掉的具体边+ISAP)

    传送门 题意:给定n个点,m条带权无向边,源点s=1,汇点t=2.去掉一些边之后使s,t不连通,求去掉的这些边(而且还要满足去掉的边权和是所有答案中最小的--最小割). n<=50,m<= ...

  7. 解题报告:【kuangbin带你飞】专题十一 网络流

    目录 A.POJ 3436 ACMComputerFactoryACM\ Computer\ FactoryACM Computer Factory[省选/NOI- ] B.POJ 3281 Dini ...

  8. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  9. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  10. kuangbin带你飞 专题1-23 题单

    kuangbin大神,对于打过ACM比赛的ACMer,无人不知无人不晓. 在此,附上vjudge平台上一位大神整理的[kuangbin带你飞]专题目录链接. [kuangbin带你飞专题目录1-23] ...

最新文章

  1. Java Date类
  2. [恢]hdu 1028
  3. 常用的遍历文件夹批处理命令
  4. mysql数据库建新分区_mysql数据库分区
  5. 如何建立一个FTP服务器(SERV-U使用教程)
  6. python 正则表达式 re findall 返回能匹配的字符串
  7. HDU 2068 Choose the best route
  8. ajax(3)---Conmon.js
  9. Google卫片下载(转)
  10. 拓扑学+计算机,拓扑学与物理学结合,量子计算机正在成为现实
  11. 直播源码开发,css预加载旋转动画 与 流光字体
  12. ei指什么_今天说一下EI是什么
  13. 【转】Latex编译报错后中断编译并改正,然后重复出现不明原因报错的解决方法...
  14. 2021年1~11月语音合成和语音识别论文月报
  15. runtime无法执行grep_Runtime.getRuntime.exec()执行linux脚本导致程序卡死有关问题
  16. python判断用户输入的两个单词是否字母相同,且出现的次数也一样
  17. titan rtx和rtx 3090 哪个强
  18. 扫盲:什么是单片机时序,如何看懂时序图
  19. 周志华机器学习--绪论
  20. Vue中实现点击当前行变色

热门文章

  1. 支持linux系统摄像头模块,Linux系统上如何安装摄像头?
  2. “大厂平均年龄29.6岁”:不是我们选择了年龄焦虑,是大厂焦虑了我们
  3. vc技术内幕第六版_六个月内幕-我还邪恶吗?
  4. imadjust函数分析一
  5. 车载OS大盘点及市场发展格局分析
  6. python获取标签属性值_Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
  7. 麒麟子Cocos Creator实用技巧四:打包原生App截图白屏解决方案
  8. python打印的时候print(f*******) 的括号里的 f' ' 是什么意思 ?
  9. python后端开发学习内容有哪些?
  10. 通过addroutes动态添加路由