题目传送门

题意:求A到B不同最短路的条数(即边不能重复走, 点可以多次走)

分析:先从A跑最短路,再从B跑最短路,如果d(A -> u) + w (u, v) + d (B -> v) == shortest path,那么这条边就是有用边(在最短路中),利用这个性质重新建最大流的图,然后增广路算法Dinic求出最多有多少条最短路.SPFA + Dinic 组合已经见过一次了

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1e3 + 5;
  5. const int M = 1e5 + 5;
  6. const int INF = 0x3f3f3f3f;
  7. struct Edge {
  8. int u, v, w, nex;
  9. Edge() {}
  10. Edge(int u, int v, int w, int nex) : u (u), v (v), w (w), nex (nex) {}
  11. }edge[2][M];
  12. struct Flow {
  13. int v, cap, rev;
  14. Flow() {}
  15. Flow(int v, int cap, int rev) : v (v), cap (cap), rev (rev) {}
  16. };
  17. vector<Flow> F[N];
  18. int it[N];
  19. int lv[N];
  20. int head[2][N];
  21. int d[2][N];
  22. bool vis[N];
  23. int n, m, e[2];
  24. int a, b, sp;
  25.  
  26. void init(int id) {
  27. memset (head[id], -1, sizeof (head[id]));
  28. e[id] = 0;
  29. }
  30.  
  31. void add_edge(int u, int v, int w, int id) {
  32. edge[id][e[id]] = Edge (u, v, w, head[id][u]);
  33. head[id][u] = e[id]++;
  34. }
  35.  
  36. void re_edge(void) {
  37. init (1);
  38. for (int i=0; i<e[0]; ++i) {
  39. add_edge (edge[0][i].v, edge[0][i].u, edge[0][i].w, 1);
  40. }
  41. }
  42.  
  43. void add_flow_edge(int u, int v, int cap) {
  44. F[u].push_back (Flow (v, cap, (int) F[v].size ()));
  45. F[v].push_back (Flow (u, 0, (int) F[u].size ()-1));
  46. }
  47.  
  48. void BFS(int s) {
  49. memset (lv, -1, sizeof (lv));
  50. queue<int> que; que.push (s); lv[s] = 0;
  51. while (!que.empty ()) {
  52. int u = que.front (); que.pop ();
  53. for (int i=0; i<F[u].size (); ++i) {
  54. Flow &e = F[u][i];
  55. if (e.cap > 0 && lv[e.v] < 0) {
  56. lv[e.v] = lv[u] + 1;
  57. que.push (e.v);
  58. }
  59. }
  60. }
  61. }
  62.  
  63. int DFS(int u, int t, int f) {
  64. if (u == t) return f;
  65. for (int &i=it[u]; i<F[u].size (); ++i) {
  66. Flow &e = F[u][i];
  67. if (e.cap > 0 && lv[u] < lv[e.v]) {
  68. int d = DFS (e.v, t, min (f, e.cap));
  69. if (d > 0) {
  70. e.cap -= d; F[e.v][e.rev].cap += d;
  71. return d;
  72. }
  73. }
  74. }
  75. return 0;
  76. }
  77.  
  78. //最大流算法
  79. int Dinic(int s, int t) {
  80. int flow = 0, f;
  81. for (; ;) {
  82. BFS (s);
  83. if (lv[t]< 0) return flow;
  84. memset (it, 0, sizeof (it));
  85. while ((f = DFS (s, t, INF)) > 0) flow += f;
  86. }
  87. }
  88.  
  89. void build_max_flow_graph(void) {
  90. for (int i=1; i<=n; ++i) F[i].clear ();
  91. for (int i=0; i<m; ++i) {
  92. Edge &e = edge[0][i];
  93. if (d[0][e.u] + e.w + d[1][e.v] == sp) {
  94. add_flow_edge (e.u, e.v, 1);
  95. add_flow_edge (e.v, e.u, 0);
  96. }
  97. }
  98. }
  99.  
  100. void SPFA(int s, int id) {
  101. memset (d[id], INF, sizeof (d[id]));
  102. memset (vis, false, sizeof (vis));
  103. d[id][s] = 0; vis[s] = true;
  104. queue<int> que; que.push (s);
  105. while (!que.empty ()) {
  106. int u = que.front (); que.pop ();
  107. vis[u] = false;
  108. for (int i=head[id][u]; ~i; i=edge[id][i].nex) {
  109. int v = edge[id][i].v, w = edge[id][i].w;
  110. if (d[id][v] > d[id][u] + w) {
  111. d[id][v] = d[id][u] + w;
  112. if (!vis[v]) {
  113. vis[v] = true; que.push (v);
  114. }
  115. }
  116. }
  117. }
  118. }
  119.  
  120. int run(void) {
  121. SPFA (a, 0);
  122. sp = d[0][b];
  123. if (sp == INF) return 0;
  124. re_edge ();
  125. SPFA (b, 1);
  126. build_max_flow_graph ();
  127. return Dinic (a, b);
  128. }
  129.  
  130. int main(void) {
  131. int T; scanf ("%d", &T);
  132. while (T--) {
  133. init (0);
  134. scanf ("%d%d", &n, &m);
  135. for (int u, v, w, i=1; i<=m; ++i) {
  136. scanf ("%d%d%d", &u, &v, &w);
  137. add_edge (u, v, w, 0);
  138. }
  139. scanf ("%d%d", &a, &b);
  140. printf ("%d\n", run ());
  141. }
  142.  
  143. return 0;
  144. }

  

SPFA+Dinic HDOJ 3416 Marriage Match IV的更多相关文章

  1. HDU 3416 Marriage Match IV (最短路径,网络流,最大流)

    HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...

  2. hdu 3416 Marriage Match IV (最短路+最大流)

    hdu 3416 Marriage Match IV Description Do not sincere non-interference. Like that show, now starvae ...

  3. HDU 3416 Marriage Match IV (求最短路的条数,最大流)

    Marriage Match IV 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/Q Description Do not si ...

  4. HDU 3416 Marriage Match IV 【最短路】(记录路径)+【最大流】

    <题目链接> 题目大意: 给你一张图,问你其中没有边重合的最短路径有多少条. 解题分析: 建图的时候记得存一下链式后向边,方便寻找最短路径,然后用Dijkstra或者SPFA跑一遍最短路, ...

  5. 【HDOJ】3416 Marriage Match IV

    先求SPSS.然后遍历每条边,检查是否为最短路径的边,如果是(dis[v]==dis[u]+w)则加入到网络流中.最后Dinic最大流. /* 3416 */ #include <iostrea ...

  6. HDU 3416 Marriage Match IV dij+dinic

    题意:给你n个点,m条边的图(有向图,记住一定是有向图),给定起点和终点,问你从起点到终点有几条不同的最短路 分析:不同的最短路,即一条边也不能相同,然后刚开始我的想法是找到一条删一条,然后光荣TLE ...

  7. (中等) HDU 3416 Marriage Match IV,SPFA+SAP。

    Description Do not sincere non-interference. Like that show, now starvae also take part in a show, b ...

  8. HDU 3416 Marriage Match IV(最短路,网络流)

    题面 Do not sincere non-interference. Like that show, now starvae also take part in a show, but it tak ...

  9. HDU 3416 Marriage Match IV (最短路径&&最大流)

    /*题意: 有 n 个城市,知道了起点和终点,有 m 条有向边,问从起点到终点的最短路一共有多少条.这是一个有向图,建边的时候要注意!!解题思路:这题的关键就是找到哪些边可以构成最短路,其实之前做最短 ...

随机推荐

  1. Android笔记:ListView

    listview属性 android:divider属性,可以指定ListView 分隔线的颜色,#0000 表示将分隔线设为透明色. listview效率的问题 adapter的三个参数int po ...

  2. Android笔记:四大组件

    1.Activity(是用户可以看到的主要的界面,使用时需要在AndroidManifest.xml中编辑声明.) 启动模式: 启动模式一共有四种,分别是standard.singleTop.sing ...

  3. 模拟赛1031d2

    巧克力棒(chocolate)Time Limit:1000ms Memory Limit:64MB题目描述LYK 找到了一根巧克力棒,但是这根巧克力棒太长了, LYK 无法一口吞进去.具体地,这根巧 ...

  4. bootstrap垂直下拉菜单默认展开

    HTML: <div class="col-md-3"> <nav class="navbar"> <div class=&quo ...

  5. Android 添加cookie

    /** * 添加cookie * * @param url */ private void setCookie(String url) { // 获取uid String uid = UserData ...

  6. [译] 用 Swift 创建自定义的键盘

    本文翻译自 How to make a custom keyboard in iOS 8 using Swift 我将讲解一些关于键盘扩展的基本知识,然后使用iOS 8 提供的新应用扩展API来创建一 ...

  7. php 审核管理

    权限管理界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  8. C#的事件

    using System; using System.Collections; using System.Collections.Generic; using System.IO; namespace ...

  9. php提示 Notice: Use of undefined constant name - assumed

    我们知道php在数组中写变量有二几种方法,我们出现这种提示就是你写成了[name]这种所以会有Notice: Use of undefined constant name - assumed name ...

  10. android 入门-引用库项目

    http://blog.csdn.net/arui319/article/details/6831164