题目传送门

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

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

#include <bits/stdc++.h>
using namespace std;const int N = 1e3 + 5;
const int M = 1e5 + 5;
const int INF = 0x3f3f3f3f;
struct  Edge    {int u, v, w, nex;Edge()    {}Edge(int u, int v, int w, int nex) : u (u), v (v), w (w), nex (nex) {}
}edge[2][M];
struct Flow {int v, cap, rev;Flow() {}Flow(int v, int cap, int rev) : v (v), cap (cap), rev (rev) {}
};
vector<Flow> F[N];
int it[N];
int lv[N];
int head[2][N];
int d[2][N];
bool vis[N];
int n, m, e[2];
int a, b, sp;void init(int id)  {memset (head[id], -1, sizeof (head[id]));e[id] = 0;
}void add_edge(int u, int v, int w, int id) {edge[id][e[id]] = Edge (u, v, w, head[id][u]);head[id][u] = e[id]++;
}void re_edge(void) {init (1);for (int i=0; i<e[0]; ++i)  {add_edge (edge[0][i].v, edge[0][i].u, edge[0][i].w, 1);}
}void add_flow_edge(int u, int v, int cap)  {F[u].push_back (Flow (v, cap, (int) F[v].size ()));F[v].push_back (Flow (u, 0, (int) F[u].size ()-1));
}void BFS(int s)    {memset (lv, -1, sizeof (lv));queue<int> que; que.push (s);   lv[s] = 0;while (!que.empty ())    {int u = que.front (); que.pop ();for (int i=0; i<F[u].size (); ++i) {Flow &e = F[u][i];if (e.cap > 0 && lv[e.v] < 0) {lv[e.v] = lv[u] + 1;que.push (e.v);}}}
}int DFS(int u, int t, int f)   {if (u == t)  return f;for (int &i=it[u]; i<F[u].size (); ++i)  {Flow &e = F[u][i];if (e.cap > 0 && lv[u] < lv[e.v]) {int d = DFS (e.v, t, min (f, e.cap));if (d > 0)    {e.cap -= d;   F[e.v][e.rev].cap += d;return d;}}}return 0;
}//最大流算法
int Dinic(int s, int t) {int flow = 0, f;for (; ;) {BFS (s);if (lv[t]< 0)   return flow;memset (it, 0, sizeof (it));while ((f = DFS (s, t, INF)) > 0)   flow += f;}
}void build_max_flow_graph(void)    {for (int i=1; i<=n; ++i)    F[i].clear ();for (int i=0; i<m; ++i) {Edge &e = edge[0][i];if (d[0][e.u] + e.w + d[1][e.v] == sp)   {add_flow_edge (e.u, e.v, 1);add_flow_edge (e.v, e.u, 0);}}
}void SPFA(int s, int id)   {memset (d[id], INF, sizeof (d[id]));memset (vis, false, sizeof (vis));d[id][s] = 0;   vis[s] = true;queue<int> que;    que.push (s);while (!que.empty ())  {int u = que.front (); que.pop ();vis[u] = false;for (int i=head[id][u]; ~i; i=edge[id][i].nex) {int v = edge[id][i].v, w = edge[id][i].w;if (d[id][v] > d[id][u] + w)    {d[id][v] = d[id][u] + w;if (!vis[v]) {vis[v] = true;    que.push (v);}}}}
}int run(void)  {SPFA (a, 0);sp = d[0][b];if (sp == INF) return 0;re_edge ();SPFA (b, 1);build_max_flow_graph ();return Dinic (a, b);
}int main(void) {int T; scanf ("%d", &T);while (T--)  {init (0);scanf ("%d%d", &n, &m);for (int u, v, w, i=1; i<=m; ++i) {scanf ("%d%d%d", &u, &v, &w);add_edge (u, v, w, 0);}scanf ("%d%d", &a, &b);printf ("%d\n", run ());}return 0;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/5010012.html

SPFA+Dinic HDOJ 3416 Marriage Match IV相关推荐

  1. HDU - 3416 Marriage Match IV(最大流+最短路)

    题目链接:点击查看 题目大意:给出一个由n个点和m条边组成的无环有向图,有自环,有重边,现在给出起点st和终点ed,问从st到ed共有多少条最短路,每条路最多只能经过一次 题目分析:看完题意后感觉是要 ...

  2. HDU 3416 Marriage Match IV

    最短路+最大流 #include<cstdio> #include<cstring> #include<string> #include<cmath> ...

  3. hdu3081 Marriage Match II(最大流)

    转载请注明出处: http://www.cnblogs.com/fraud/           --by fraud Marriage Match II Time Limit: 2000/1000 ...

  4. 【HDU - 3081】Marriage Match II(网络流最大流,二分+网络流)

    题干: Presumably, you all have known the question of stable marriage match. A girl will choose a boy; ...

  5. HDU 3277 Marriage Match III(并查集+二分+最大流)

    题意:和HDU3081一样的题意,只不过多了一个条件,每个女孩除了能选自己喜欢的男生之外,还能选不超过K个自己不喜欢的男生,问游戏最多能进行几轮 思路:除了选喜欢的,还能选任意K个不喜欢的,怎么建图呢 ...

  6. [kuangbin带你飞]专题十一 网络流\N HDU 3081 Marriage Match II

    题目描述 Presumably, you all have known the question of stable marriage match. A girl will choose a boy; ...

  7. HDU 3081 Marriage Match II【并查集+二分图最大匹配】

    大意:有n个男孩n个女孩,告诉你每个女孩喜欢哪些男孩,又告诉你女孩之间的存在一些朋友关系 一个女孩可以和她喜欢的男孩结婚也可以和她朋友喜欢的男孩结婚, 并且朋友关系可以传递 Once every gi ...

  8. HDU3081 Marriage Match II —— 传递闭包 + 二分图最大匹配 or 传递闭包 + 二分 + 最大流...

    题目链接:https://vjudge.net/problem/HDU-3081 Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    ...

  9. HDU - 3081 Marriage Match II(二分+并查集+最大流/匈牙利删边)

    题目链接:点击查看 题目大意:n个男生和n个女生配对,配对规则如下: 每个女生都可以选择没有吵过架的男生匹配 若女生A的好朋友是女生B,且女生B没有和男生C吵过架,则女生A也可以和男生C匹配 现在问最 ...

最新文章

  1. 今晚20:00 | 港科大郑光廷院士详解人工视觉技术发展及应用
  2. 选红叶家装不就得了,用得着这么费事吗?!
  3. mysql训练逻辑的题_全国计算机等级考试二级教程mysql复习题练习题.docx
  4. 12306订票候补是个坑_加30元就能抢到火车票?12306这个功能更靠谱!今起可买除夕火车票,抢票高峰来了...
  5. JavaScript(19)jQuery HTML 获取和设置内容和属性
  6. pwn学习总结(三) —— 栈溢出经典题型整理
  7. WCF六大步的前三步
  8. SAP Spartacus list item点击之后的detail页面跳转
  9. 火炬之光使用了哪些技术
  10. 微信小程序中base64转换成图片;uni-app小程序base64转图片;微信小程序base64文件转图片;微信小程序base64图片转图片
  11. git 历史操作日志_Git - 查看提交历史
  12. python decorator_python3(十八)decorator
  13. fullcalendar 只保留周_周末大利好!重磅全球指数加仓,210亿资金涌向A股「投资周历来了」...
  14. 计算机实用知识风云初动,风云初动 第一节 养气韬光
  15. 太不可思议了,竟然用交通锥当 logo!
  16. cocos2d-js 3.0 ios平台编译打包
  17. iOS端播放VR图片
  18. 利用DOCX文档远程模板注入执行宏代码
  19. 【企业数字化转型】中台战略
  20. # 互动媒体期末作业——P5.js“画板”

热门文章

  1. oracle报错注入的一些函数
  2. HighCharts/Highstock使用小结,使用汉化及中文帮助文档
  3. PyQt4日历部件QXalendarWidget
  4. Android应用程序插件化研究之DexClassLoader
  5. Erlang中一些错误或者异常的标识
  6. RE管理器root explorer基础操作教程
  7. 思科路由器端口映射配置实例
  8. python 求和并排序_Python堆排序原理与实现方法详解
  9. 不要相信 errno 可靠
  10. 浅谈Linux协议和组成