题意:给一个边长为1的无向图,求删去最多的边使得从a到b距离<=f,从c到d距离<=g,a,b,c,d,f,g都是给定的,求最多删去的边数。

思路:反过来思考,用最少的边构造两条从a到b,从c到d的路径,使得它们满足题目中的条件。于是可以把这两条路径的相对位置分为两种情况,不相交和相交,对于不相交的情况答案就是两组距离之和,对于相交的情况,两条路径肯定共享一段连续路径,对于共享多段的情况可以把中间没共享的取较小值变成共享,得到的距离和不会更大,因此最优情况一定是一段连续的路径。于是可以枚举共享段的两个端点来更新答案,两点之间距离可以通过n次bfs求出。有个小地方需要注意,共享段对于两条路径来说是有方向的,所以需要正反更新。

  1. #pragma comment(linker, "/STACK:10240000,10240000")
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <algorithm>
  6. #include <cstdlib>
  7. #include <cstring>
  8. #include <map>
  9. #include <queue>
  10. #include <deque>
  11. #include <cmath>
  12. #include <vector>
  13. #include <ctime>
  14. #include <cctype>
  15. #include <set>
  16. #include <bitset>
  17. #include <functional>
  18. #include <numeric>
  19. #include <stdexcept>
  20. #include <utility>
  21.  
  22. using namespace std;
  23.  
  24. #define mem0(a) memset(a, 0, sizeof(a))
  25. #define mem_1(a) memset(a, -1, sizeof(a))
  26. #define lson l, m, rt << 1
  27. #define rson m + 1, r, rt << 1 | 1
  28. #define define_m int m = (l + r) >> 1
  29. #define rep_up0(a, b) for (int a = 0; a < (b); a++)
  30. #define rep_up1(a, b) for (int a = 1; a <= (b); a++)
  31. #define rep_down0(a, b) for (int a = b - 1; a >= 0; a--)
  32. #define rep_down1(a, b) for (int a = b; a > 0; a--)
  33. #define all(a) (a).begin(), (a).end()
  34. #define lowbit(x) ((x) & (-(x)))
  35. #define constructInt5(name, a, b, c, d, e) name(int a = 0, int b = 0, int c = 0, int d = 0, int e = 0): a(a), b(b), c(c), d(d), e(e) {}
  36. #define constructInt4(name, a, b, c, d) name(int a = 0, int b = 0, int c = 0, int d = 0): a(a), b(b), c(c), d(d) {}
  37. #define constructInt3(name, a, b, c) name(int a = 0, int b = 0, int c = 0): a(a), b(b), c(c) {}
  38. #define constructInt2(name, a, b) name(int a = 0, int b = 0): a(a), b(b) {}
  39. #define pchr(a) putchar(a)
  40. #define pstr(a) printf("%s", a)
  41. #define sstr(a) scanf("%s", a)
  42. #define sint(a) scanf("%d", &a)
  43. #define sint2(a, b) scanf("%d%d", &a, &b)
  44. #define sint3(a, b, c) scanf("%d%d%d", &a, &b, &c)
  45. #define pint(a) printf("%d\n", a)
  46. #define test_print1(a) cout << "var1 = " << a << endl
  47. #define test_print2(a, b) cout << "var1 = " << a << ", var2 = " << b << endl
  48. #define test_print3(a, b, c) cout << "var1 = " << a << ", var2 = " << b << ", var3 = " << c << endl
  49. #define mp(a, b) make_pair(a, b)
  50. #define pb(a) push_back(a)
  51.  
  52. typedef long long LL;
  53. typedef pair<int, int> pii;
  54. typedef vector<int> vi;
  55.  
  56. const int dx[] = {, , -, , , , -, -};
  57. const int dy[] = {-, , , , , -, , - };
  58. const int maxn = 3e3 + ;
  59. const int md = ;
  60. const int inf = 1e9 + ;
  61. const LL inf_L = 1e18 + ;
  62. const double pi = acos(-1.0);
  63. const double eps = 1e-;
  64.  
  65. template<class T>T gcd(T a, T b){return b==?a:gcd(b,a%b);}
  66. template<class T>bool max_update(T &a,const T &b){if(b>a){a = b; return true;}return false;}
  67. template<class T>bool min_update(T &a,const T &b){if(b<a){a = b; return true;}return false;}
  68. template<class T>T condition(bool f, T a, T b){return f?a:b;}
  69. template<class T>void copy_arr(T a[], T b[], int n){rep_up0(i,n)a[i]=b[i];}
  70. int make_id(int x, int y, int n) { return x * n + y; }
  71.  
  72. struct Graph {
  73. vector<vector<int> > G;
  74. void clear() { G.clear(); }
  75. void resize(int n) { G.resize(n + ); }
  76. void add(int u, int v) { G[u].push_back(v); }
  77. vector<int> & operator [] (int u) { return G[u]; }
  78. };
  79. Graph G;
  80.  
  81. int n, m, s1, s2, t1, t2, l1, l2, ans, dist[maxn][maxn];
  82. bool vis[maxn];
  83.  
  84. void chk(int u, int v, int w) {
  85. int cost1 = dist[s1][u] + w + dist[v][t1], cost2 = dist[s2][u] + w + dist[v][t2], cost = cost1 + cost2 - w;
  86. if (cost1 <= l1 && cost2 <= l2) min_update(ans, cost);
  87. swap(u, v);
  88. cost2 = dist[s2][u] + w + dist[v][t2];
  89. cost = cost1 + cost2 - w;
  90. if (cost1 <= l1 && cost2 <= l2) min_update(ans, cost);
  91. }
  92.  
  93. void bfs(int s) {
  94. queue<pii> q;
  95. q.push(make_pair(s, ));
  96. mem0(vis);
  97. vis[s] = true;
  98. while (!q.empty()) {
  99. pii hnode = q.front(); q.pop();
  100. int u = hnode.first, w = hnode.second;
  101. dist[s][u] = w;
  102. int sz = G[u].size();
  103. rep_up0(i, sz) {
  104. int v = G[u][i];
  105. if (!vis[v]) {
  106. vis[v] = true;
  107. q.push(make_pair(v, w + ));
  108. }
  109. }
  110. }
  111. }
  112.  
  113. int main() {
  114. //freopen("in.txt", "r", stdin);
  115. cin >> n >> m;
  116. memset(dist, 0x3f, sizeof(dist));
  117. G.clear();
  118. G.resize(n);
  119. rep_up0(i, m) {
  120. int u, v;
  121. sint2(u, v);
  122. G.add(u, v);
  123. G.add(v, u);
  124. }
  125. sint3(s1, t1, l1);
  126. sint3(s2, t2, l2);
  127. rep_up1(i, n) {
  128. bfs(i);
  129. }
  130. if (dist[s1][t1] > l1 || dist[s2][t2] > l2) {
  131. puts("-1");
  132. return ;
  133. }
  134. ans = dist[s1][t1] + dist[s2][t2];
  135. rep_up1(i, n) {
  136. rep_up1(j, n) {
  137. chk(i, j, dist[i][j]);
  138. }
  139. }
  140. cout << m - ans << endl;
  141. return ;
  142. }

[codeforces-543B]bfs求最短路的更多相关文章

  1. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...

  2. POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

    POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...

  3. UVa 816 (BFS求最短路)

    /*816 - Abbott's Revenge ---代码完全参考刘汝佳算法入门经典 ---strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:char * strchr (cons ...

  4. BFS求最短路

    假设有一个n行m列的迷宫,每个单位要么是空地(用1表示)要么是障碍物(用0表示).如和找到从起点到终点的最短路径?利用BFS搜索,逐步计算出每个节点到起点的最短距离,以及最短路径每个节点的前一个节点. ...

  5. UVA 816 -- Abbott's Revenge(BFS求最短路)

     UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...

  6. 6.4.2 用BFS求最短路

    前面的篇幅占了太多,再次新开一章,讲述BFS求最短路的问题 注意此时DFS就没有BFS好用了,因为DFS更适合求全部解,而BFS适合求最优解 这边再次提醒拓扑变换的思想在图形辨认中的重要作用,需要找寻 ...

  7. CodeForces - 987D Fair (BFS求最短路)

    题意:有N个城市,M条双向道路连接两个城市,整个图保证连通.有K种物品,但每个城市只有一种,现在它们都需要S种物品来举办展览,可以去其他城市获取该城市的物品,花费是两城市之间的最短路径长度.求每个城市 ...

  8. 利用BFS求最短路

    利用BFS求图的最短路, POJ3984 #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<string.h& ...

  9. hdu 3760(2次bfs求最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3760 思路:首先是建反图,从点n开始做spfa求出n到各点的最短路,然后从1点开始搜最小序列,对于边( ...

随机推荐

  1. springboot前后端分离跨域

    @Configurationpublic class CrossConfig implements WebMvcConfigurer { @Override public void addCorsMa ...

  2. 详解 通道 (Channel 接口)

    在本篇博文中,本人主要讲解NIO 的两个核心点 -- 缓冲区(Buffer) 和 通道 (Channel)之一的 缓冲区(Buffer), 有关NIO流的其他知识点请观看本人博文<详解 NIO流 ...

  3. Buu刷题

    前言 希望自己能够更加的努力,希望通过多刷大赛题来提高自己的知识面.(ง •_•)ง easy_tornado 进入题目 看到render就感觉可能是模板注入的东西 hints.txt给出提示,可以看 ...

  4. v&n赛 ML 第一步(python解决)

    题目链接 给了70组x,y,根据提示,是求拟合曲线,再通过x求y 知道MATLAB应该录入就能解决吧,但是没下这软件,试试用python解决 #coding:utf- from pwn import ...

  5. [javascript]各种页面定时跳转(倒计时跳转)代码总结

    (1)使用setTimeout函数实现定时跳转(如下代码要写在body区域内) <script type="text/javascript"> //3秒钟之后跳转到指定 ...

  6. CentOS7.7下二进制部署MySQL多版本多实例实战

    第一章 需求说明 部署MySQL5.7的三个多实例环境(端口分别为3307,3308,3309) 部署MySQL5.6和8.0版本数据库实例((端口分别为3316和3326) 第二章 环境准备 1.虚 ...

  7. 你知道什么是 GitHub Action 么?

    本文是 GitHub Action 的入门教程,如您已有相关使用经验可以直接关掉. GitHub Action 是 GitHub 于 2018 年 10 月推出的一个 CI\CD 服务. 之前一直都是 ...

  8. 一行配置美化 nginx 目录 autoindex.html

    demo

  9. 图数据库的内部结构 (NEO4j)

    What “Graph First” Means for Native Graph Technology Neo4j是一个具有原生处理(native processing)功能和原生图存储(nativ ...

  10. An example shows several CIM-XML extension headers

    The example below shows several CIM-XML extension headers for a GetClass operation on the root/cimv2 ...