SPFA+Dinic HDOJ 3416 Marriage Match IV
题目传送门
题意:求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相关推荐
- HDU - 3416 Marriage Match IV(最大流+最短路)
题目链接:点击查看 题目大意:给出一个由n个点和m条边组成的无环有向图,有自环,有重边,现在给出起点st和终点ed,问从st到ed共有多少条最短路,每条路最多只能经过一次 题目分析:看完题意后感觉是要 ...
- HDU 3416 Marriage Match IV
最短路+最大流 #include<cstdio> #include<cstring> #include<string> #include<cmath> ...
- hdu3081 Marriage Match II(最大流)
转载请注明出处: http://www.cnblogs.com/fraud/ --by fraud Marriage Match II Time Limit: 2000/1000 ...
- 【HDU - 3081】Marriage Match II(网络流最大流,二分+网络流)
题干: Presumably, you all have known the question of stable marriage match. A girl will choose a boy; ...
- HDU 3277 Marriage Match III(并查集+二分+最大流)
题意:和HDU3081一样的题意,只不过多了一个条件,每个女孩除了能选自己喜欢的男生之外,还能选不超过K个自己不喜欢的男生,问游戏最多能进行几轮 思路:除了选喜欢的,还能选任意K个不喜欢的,怎么建图呢 ...
- [kuangbin带你飞]专题十一 网络流\N HDU 3081 Marriage Match II
题目描述 Presumably, you all have known the question of stable marriage match. A girl will choose a boy; ...
- HDU 3081 Marriage Match II【并查集+二分图最大匹配】
大意:有n个男孩n个女孩,告诉你每个女孩喜欢哪些男孩,又告诉你女孩之间的存在一些朋友关系 一个女孩可以和她喜欢的男孩结婚也可以和她朋友喜欢的男孩结婚, 并且朋友关系可以传递 Once every gi ...
- HDU3081 Marriage Match II —— 传递闭包 + 二分图最大匹配 or 传递闭包 + 二分 + 最大流...
题目链接:https://vjudge.net/problem/HDU-3081 Marriage Match II Time Limit: 2000/1000 MS (Java/Others) ...
- HDU - 3081 Marriage Match II(二分+并查集+最大流/匈牙利删边)
题目链接:点击查看 题目大意:n个男生和n个女生配对,配对规则如下: 每个女生都可以选择没有吵过架的男生匹配 若女生A的好朋友是女生B,且女生B没有和男生C吵过架,则女生A也可以和男生C匹配 现在问最 ...
最新文章
- 今晚20:00 | 港科大郑光廷院士详解人工视觉技术发展及应用
- 选红叶家装不就得了,用得着这么费事吗?!
- mysql训练逻辑的题_全国计算机等级考试二级教程mysql复习题练习题.docx
- 12306订票候补是个坑_加30元就能抢到火车票?12306这个功能更靠谱!今起可买除夕火车票,抢票高峰来了...
- JavaScript(19)jQuery HTML 获取和设置内容和属性
- pwn学习总结(三) —— 栈溢出经典题型整理
- WCF六大步的前三步
- SAP Spartacus list item点击之后的detail页面跳转
- 火炬之光使用了哪些技术
- 微信小程序中base64转换成图片;uni-app小程序base64转图片;微信小程序base64文件转图片;微信小程序base64图片转图片
- git 历史操作日志_Git - 查看提交历史
- python decorator_python3(十八)decorator
- fullcalendar 只保留周_周末大利好!重磅全球指数加仓,210亿资金涌向A股「投资周历来了」...
- 计算机实用知识风云初动,风云初动 第一节 养气韬光
- 太不可思议了,竟然用交通锥当 logo!
- cocos2d-js 3.0 ios平台编译打包
- iOS端播放VR图片
- 利用DOCX文档远程模板注入执行宏代码
- 【企业数字化转型】中台战略
- # 互动媒体期末作业——P5.js“画板”