题目链接:点击查看

题目大意:给出一张无向图,1为起点,2为终点,删除每条边都需要权值wi,题目需要求将起点与终点分割为两个部分的最小花费,并且输出方案

题目分析:如果不让输出方案的话就是一个裸的最大流最小割问题了,既然题目要求输出路径,我们应该考虑一下该怎么办

其实换个思路,我们在跑完最大流后,已经将整张图分为了两个不相连的集合了,此时我们只需要对于起点,在残余流量上跑一边图的深度遍历或者广度遍历进行染色,然后枚举每一条边,若当前边的两个端点的颜色不同,则说明这条边就是割边了

这个题目对于无向图的处理,可以直接在网络流建边时就将addedge函数里反向边的权值从0改为w,也可以直接建边,只不过这样需要多开销一倍的内存,具体看个人爱好吧

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=55;struct Edge
{int to,w,next;
}edge[N*20];//边数int head[N],cnt,vis[N];void addedge(int u,int v,int w)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=w;//这句话和一般的网络流有所不同edge[cnt].next=head[v];head[v]=cnt++;
}int d[N],now[N*20];//深度 当前弧优化bool bfs(int s,int t)//寻找增广路
{memset(d,0,sizeof(d));queue<int>q;q.push(s);now[s]=head[s];d[s]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(d[v])continue;if(!w)continue;d[v]=d[u]+1;now[v]=head[v];q.push(v);if(v==t)return true;}}return false;
}int dinic(int x,int t,int flow)//更新答案
{if(x==t)return flow;int rest=flow,i;for(i=now[x];i!=-1&&rest;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(w&&d[v]==d[x]+1){int k=dinic(v,t,min(rest,w));if(!k)d[v]=0;edge[i].w-=k;edge[i^1].w+=k;rest-=k;}}now[x]=i;return flow-rest;
}void init()
{memset(vis,0,sizeof(vis));memset(head,-1,sizeof(head));cnt=0;
}int solve(int st,int ed)
{int ans=0,flow;while(bfs(st,ed))while(flow=dinic(st,ed,inf))ans+=flow;return ans;
}void dfs(int u)
{vis[u]=1;for(int i=head[u];~i;i=edge[i].next){int v=edge[i].to;if(vis[v])continue;if(edge[i].w)dfs(v);}
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int n,m;while(scanf("%d%d",&n,&m)!=EOF&&n+m){init();while(m--){int u,v,w;scanf("%d%d%d",&u,&v,&w);addedge(u,v,w);}solve(1,2);//对于起点-终点跑最大流,答案就是最小割dfs(1);//对起点所在的集合染色for(int i=0;i<cnt;i+=2)//枚举每一条边{int u=edge[i+1].to;int v=edge[i].to;if(vis[u]^vis[v])//如果颜色不同,输出答案printf("%d %d\n",u,v);}printf("\n");}return 0;
}

UVA - 10480 Sabotage(最小割-最大流+输出割边)相关推荐

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

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

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

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

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

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

  4. 网络流 最大流 最小割 费用流

    [腾讯文档]网络流初步 网络流初步 文章目录 网络流初步 一.网络流简介 1. 网络 2. 流 3. 再次理解网络流 二.常见题型(三种) 三.相关问题对应算法介绍 1.最大流 (1) FF算法 - ...

  5. hdu 4289(最小割最大流定理)

    题意:有N个城市,现在城市S出现了一伙歹徒,他们想运送一些炸弹到D城市,不过警方已经得到了线报知道他们的事情,不过警察不知道他们所在的具体位置,所以只能采取封锁城市的办法来阻断暴徒,不过封锁城市是需要 ...

  6. HDU-1569 方格取数(2) 最小割最大流

    题义很简单,还记得方格取数(1)的时候,使用状态压缩写的,这里由于行列数太大,因此无法进行压缩.所以要运用的最小割最大流的思想来解这道题. 大概是这样分析的,题义是要我们求在一个方格内取出N个点,使得 ...

  7. Destroying The Graph 最小点权集--最小割--最大流

    Destroying The Graph 构图思路: 1.将所有顶点v拆成两个点, v1,v2 2.源点S与v1连边,容量为 W- 3.v2与汇点连边,容量为 W+ 4.对图中原边( a, b ), ...

  8. 图像分割经典算法--《最小割最大流》(Minimum Cut——Max Flow)

    1.算法介绍 最小割算法(Minimum Cut)是图像分割的经典算法之一,同时也在"Graph Cut"."Grab Cut"等算法中都有被使用过.最小割最大 ...

  9. UVA10480:Sabotage(最小割+输出)

    Sabotage 题目链接:https://vjudge.net/problem/UVA-10480 Description: The regime of a small but wealthy di ...

最新文章

  1. 【网络编程】同步IO、异步IO、阻塞IO、非阻塞IO
  2. IDEA万能快捷键,你必须知道的17个实用技巧,提升撸码效率!
  3. 10.2 接口关系下的多态
  4. 【每周CV论文推荐】 CV领域中数据增强相关的论文推荐
  5. 关闭 IOS8 最近使用 最近联系人
  6. 大数据workshop:《云数据·大计算:海量日志数据分析与应用》之《社交数据分析:好友推荐》篇...
  7. Go语言基础进阶—程序结构—赋值
  8. 阿里云联合信通院发布《基于云计算的数字化业务安全工程要求》
  9. matlab连接散射点,使用小波散射做信号分类
  10. Linux屏幕取词翻译 - 思路及实现过程
  11. 一个前端开发者的mac装机清单
  12. 美通企业日报 | 阿里、腾讯占领公有云市场半壁江山;2018年雅思考生350万人次创新高...
  13. Apple苹果ID怎么修改地区经验之谈
  14. UI设计---化繁为简
  15. 论文阅读笔记:Neural Belief Tracker: Data-Driven Dialogue State Tracking
  16. 实车路试注意事项(路试类)
  17. 基于单片机的升力检测仪系统设计
  18. 自定义组件使用el-dialog,且内含表单时,表单提交时字段报错undefined
  19. python 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出
  20. WebSocket实现在线聊天

热门文章

  1. python内置库绘制33角形_33 python format练习题 利用format方法生成一个星号三角形...
  2. Redis实现分布式Session管理
  3. ConcurrentHashMap的源码分析-tryPresize
  4. MyBatis创建SqlSession-怎么拿到一个SqlSessionTemplate?
  5. ClassPathBeanDefinitionScanner 扫描给定的包及其子包
  6. aop简介-aop相关概念
  7. 类的加载过程三:Initialization
  8. 基于注解的方式配置bean
  9. POI的入门:概述和创建EXCEL
  10. spring基于XML的声明式事务控制-配置步骤