题目:

http://acm.hdu.edu.cn/showproblem.php?pid=5294

题意:

n个点,m条边,构建有权无向图。

求出删去最少条边数可以使得图没有最短路径,以及删出最多条边使得图仍有最多条路径。

思路:

最短路处理出最短路径图,做法是使用dis数组,若若dis[v]-dis[u] = w(u,v),则该路在最短路径中。

建出最短路径之后 跑一次网络流,得到第一个答案。

在跑最短路中记录最短路的最少路数,ans2 = m - minb.

AC.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>using namespace std;
const int INF = 0x7f7f7f;
const int MAXM = 12e4+5;
const int MAXN = 2e3+5;int n, m;
struct Edge {int to, w, next;
}edge[MAXM];
int tot, head[MAXN];
void addedge(int u, int v, int w)
{edge[tot].to = v;edge[tot].w = w;edge[tot].next = head[u];head[u] = tot++;edge[tot].to = u;edge[tot].w = w;edge[tot].next = head[v];head[v] = tot++;}int dis[MAXN], vis[MAXN];
int minb[MAXN];
int spfa(int s)
{memset(dis, 0x3f, sizeof(dis));memset(vis, 0, sizeof(vis));memset(minb, 0x3f, sizeof(minb));queue<int> q;dis[s] = 0;minb[s] = 0;vis[s] = 1;q.push(s);while(!q.empty()) {int u = q.front(); q.pop();vis[u] = 0;for(int i = head[u]; ~i; i = edge[i].next) {int v = edge[i].to, w = edge[i].w;if(dis[v] == dis[u] + w) {minb[v] = min(minb[v], minb[u] + 1);if(!vis[v]) {vis[v] = 1;q.push(v);}}if(dis[v] > dis[u] + w) {dis[v] = dis[u] + w;minb[v] = minb[u] + 1;if(!vis[v]) {vis[v] = 1;q.push(v);}}}}
}
struct Eg {int u, cap, rev;Eg(int uu, int cc, int rr) {u = uu; cap = cc; rev = rr;}
};
vector<Eg> G[MAXN];
bool used[MAXN];
void add(int u, int v, int cap)
{G[u].push_back(Eg(v, cap, G[v].size()));G[v].push_back(Eg(u, 0, G[u].size()-1));
}
void build()
{for(int i = 1; i <= n; ++i) {for(int j = head[i]; ~j; j = edge[j].next) {int v = edge[j].to, w = edge[j].w;if(dis[v] - dis[i] == w) {add(i, v, 1);}}}
}
int dfs(int v, int t, int f)
{if(v == t) return f;used[v] = true;for(int i = 0; i < G[v].size(); ++i) {Eg &e = G[v][i];if(!used[e.u] && e.cap > 0) {int d = dfs(e.u, t, min(f, e.cap));if(d > 0) {e.cap -= d;G[e.u][e.rev].cap += d;return d;}}}return 0;
}
int max_flow(int s, int t)
{int flow = 0;while(1) {memset(used, 0, sizeof(used));int f = dfs(s, t, INF);if(f == 0) return flow;flow += f;}
}
void init()
{tot = 0;memset(head, -1, sizeof(head));for(int i = 0; i <= n; ++i) {G[i].clear();}}
int main()
{//freopen("in", "r", stdin);while(~scanf("%d %d", &n, &m)) {init();for(int i = 0; i < m; ++i) {int u, v, w;scanf("%d %d %d", &u, &v, &w);addedge(u, v, w);}spfa(1);build();int ans = max_flow(1, n);printf("%d %d\n", ans, m-minb[n]);}return 0;
}

HDU 5294 - Tricks Device(最短路+最小割)相关推荐

  1. HDU 5294 Tricks Device(最短路+最大流)

    题意:给一个无向图(连通的),张在第n个点,吴在第1个点,'吴'只能通过最短路才能到达'张',两个问题:(1)张最少毁掉多少条边后,吴不可到达张(2)吴在张毁掉最多多少条边后仍能到达张. 思路:将所有 ...

  2. hdu 5294 Tricks Device

    中规中矩的做法,第二发SAP.贴一发留恋. #include<cstdio> #include<cstring> #include<algorithm> #incl ...

  3. 【HDU】4859 海岸线 黑白染色+最小割

    传送门:[HDU]4859 题目分析: 最小割的思想真是博大精深! 本题的模型是最小割. 我们需要最大化海岸线的长度,如果相邻两点属性不同才会存在海岸线(海和陆地),所以我们可以将题目转化成最小化不是 ...

  4. hdu 6852Path6(最短路+最小割)

    传送门 •题意 有n个城市,标号1-n 现花费最小的代价堵路 使得从1号城市到n号城市的路径边长 (注意只是变长不是最长) 堵一条路的代价是这条路的权值 •思路 在堵路以前,从1到n的最小路径当然是最 ...

  5. HDU - 5889 Barricade(最短路+最小割-最大流)

    题目链接:点击查看 题目大意:给出一张无向图,每条边的长度为1,第i条边建立障碍的花费为wi,题目要求在保证从1到n号点的所有的最短路径上,都有障碍的情况下的最小费用 题目分析:要求最短路上的最小割, ...

  6. HDU 5457 Hold Your Hand【最小割+字典树】

    在这里先感谢YYN菊苣对我解题的帮助. 首先,我们按照前缀和后缀建立两棵字典树. 节点总数为256∗8∗2256*8*2,每一个叶子节点是我们的数字. 其次,我们对读入的操作来更新字典树,假设字典树有 ...

  7. Tricks Device 最短路+最大流

    http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?pid=1006&ojid=0&cid=12578&hide= ...

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

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

  9. 【HDU - 3870】Catch the Theves(平面图转对偶图最短路,网络流最小割)

    题干: A group of thieves is approaching a museum in the country of zjsxzy,now they are in city A,and t ...

  10. 【HDU - 5889】Barricade(最短路+网络流,最小割)

    题干: The empire is under attack again. The general of empire is planning to defend his castle. The la ...

最新文章

  1. C语言程序设计最佳分组,求助把一些数值按指定的和进行分组
  2. delete []实现机制
  3. 对话高博(一)| 机器码、Pascal,以及计算机学习的分形
  4. 万年历c语言编程代码_C语言高效编程与代码优化~
  5. ACM训练计划建议(转)
  6. Word2Vec学习笔记(五)——Negative Sampling 模型(续)
  7. sqlservr.exe占用大量内存
  8. HDU1560 DNA sequence IDA* + 强力剪枝 [kuangbin带你飞]专题二
  9. Android 服务
  10. ucgui添加自定义汉字库
  11. C++视频分解和图片合成视频代码
  12. sas mysql乱码_在SAS中如何解决中文乱码问题
  13. axios http请求报错: Request failed with status code 400
  14. 浙工大 drcom客户端 嵌入 Linux路由器
  15. 台式计算机文件打不开怎么回事,电脑打不开文件是怎么回事 电脑打不开文件是什么原因...
  16. ubuntu18.04安装opencv viz模块
  17. 工业交换机智能监控管理方案
  18. hasnext() java_java中Scanner的hasNext()的疑问
  19. 基于HFS快速搭建HTTP文件服务器
  20. android studio 小白使用记

热门文章

  1. 计算机学报在线阅读,计算机研究与发展计算机学报软件学报电子学报西安交通大学学报.doc...
  2. 傅里叶级数与傅里叶变换公式推导
  3. 电动车控制器c语言编程,电动车控制器C语言源代码..doc
  4. html css js实现快递单打印_Node.js开发RPA自动抓取网页的文字内容
  5. [2019/12]饮水姑苏,止于至善
  6. 什么是link标签?
  7. html页面的结构标记是什么意思,html页面的结构标记是什么
  8. DigiCert SSL证书支持中文域名申请吗?
  9. python编程猜拳游戏_python代码实现猜拳小游戏
  10. 第二人生的源码分析(101)脚本的初步知识