1.次小生成树

非严格次小生成树:边权和小于等于最小生成树的边权和

严格次小生成树:    边权和小于最小生成树的边权和

算法:先建好最小生成树,然后对于每条不在最小生成树上的边(u,v,w)如果我们把它放到最小生成树中,会形成一个环,那么再从这个环上删除一个除加进去的边外且小于(或等于)当前w的最大权值边,可以用倍增(或树剖)维护链上的最大值来实现非严格的,对于严格的来说,最大值可能等于w,那么就再维护一个次大值。

P4180 【模板】严格次小生成树[BJWC2010]

代码:

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #pragma GCC optimize(4)
  4. #include<bits/stdc++.h>
  5. using namespace std;
  6. #define y1 y11
  7. #define fi first
  8. #define se second
  9. #define pi acos(-1.0)
  10. #define LL long long
  11. //#define mp make_pair
  12. #define pb push_back
  13. #define ls rt<<1, l, m
  14. #define rs rt<<1|1, m+1, r
  15. #define ULL unsigned LL
  16. #define pll pair<LL, LL>
  17. #define pli pair<LL, int>
  18. #define pii pair<int, int>
  19. #define piii pair<pii, int>
  20. #define pdd pair<double, double>
  21. #define mem(a, b) memset(a, b, sizeof(a))
  22. #define debug(x) cerr << #x << " = " << x << "\n";
  23. #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  24. //head
  25.  
  26. const int N = 1e5 + , M = 3e5 + ;
  27. const int INF = 0x3f3f3f3f;
  28. pair<int, pii> e[M];
  29. vector<pii> g[N];
  30. int fa[N], deep[N], anc[N][];
  31. pii mx[N][];
  32. bool vis[M];
  33. void init(int n) {
  34. for (int i = ; i <= n; ++i) fa[i] = i;
  35. }
  36. int Find(int x) {
  37. if(x == fa[x]) return x;
  38. else return fa[x] = Find(fa[x]);
  39. }
  40. pii MX(pii a, pii b) {
  41. pii res = {-INF, -INF};
  42. if(a.fi > b.fi) res.fi = a.fi, res.se = b.fi;
  43. else if(a.fi < b.fi) res.fi = b.fi, res.se = a.fi;
  44. else res.fi = a.fi;
  45. res.se = max(res.se, a.se);
  46. res.se = max(res.se, b.se);
  47. return res;
  48. }
  49. void dfs(int u, int o, int w) {
  50. deep[u] = deep[o] + ;
  51. if(u != ) {
  52. anc[u][] = o;
  53. for (int i = ; i < ; ++i) anc[u][i] = anc[anc[u][i-]][i-];
  54. mx[u][] = {w, -INF};
  55. for (int i = ; i < ; ++i) mx[u][i] = MX(mx[u][i-], mx[anc[u][i-]][i-]);
  56. }
  57. else {
  58. for (int i = ; i < ; ++i) anc[u][i] = o;
  59. for (int i = ; i < ; ++i) mx[o][i] = mx[u][i] = {-INF, -INF};
  60. }
  61. for (pii p : g[u]) {
  62. int v = p.fi;
  63. int w = p.se;
  64. if(v != o) {
  65. dfs(v, u, w);
  66. }
  67. }
  68. }
  69. int lca(int u, int v) {
  70. if(deep[u] < deep[v]) swap(u, v);
  71. for (int i = ; i >= ; --i) if(deep[anc[u][i]] >= deep[v]) u = anc[u][i];
  72. if(u == v) return u;
  73. for (int i = ; i >= ; --i) if(anc[u][i] != anc[v][i]) u = anc[u][i], v = anc[v][i];
  74. return anc[u][];
  75. }
  76. int main() {
  77. int n, m;
  78. LL tot = ;
  79. scanf("%d %d", &n, &m);
  80. for (int i = ; i <= m; ++i) scanf("%d %d %d", &e[i].se.fi, &e[i].se.se, &e[i].fi);
  81. init(n);
  82. sort(e+, e++m);
  83. for (int i = ; i <= m; ++i) {
  84. int x = Find(e[i].se.fi);
  85. int y = Find(e[i].se.se);
  86. if(x == y) vis[i] = true;
  87. else fa[x] = y, g[e[i].se.fi].pb({e[i].se.se, e[i].fi}), g[e[i].se.se].pb({e[i].se.fi, e[i].fi}), tot += e[i].fi;
  88. }
  89. dfs(, , );
  90. LL ans = LONG_MAX;
  91. for (int i = ; i <= m; ++i) {
  92. if(vis[i]) {
  93. int u = e[i].se.fi;
  94. int v = e[i].se.se;
  95. int l = lca(u, v);
  96. pii mm = {-INF, -INF};
  97. for (int i = ; i >= ; i--) if(deep[anc[u][i]] >= deep[l]) mm = MX(mm, mx[u][i]), u = anc[u][i];
  98. ;
  99. for (int i = ; i >= ; i--) if(deep[anc[v][i]] >= deep[l]) mm = MX(mm, mx[v][i]), v = anc[v][i] ;
  100. if(mm.fi < e[i].fi) ans = min(ans, e[i].fi + tot - mm.fi);
  101. else if(mm.se < e[i].fi && mm.se != -INF)ans = min(ans, e[i].fi + tot - mm.se);
  102. }
  103. }
  104. printf("%lld\n", ans);
  105. return ;
  106. }

2.次短路

次短路:到某个点的距离比最短路距离大的距离

参照挑战程序设计竞赛P108

到某个点v的次短路要么是其他某个顶点u的最短路再加上u -> v的边,要么是到u的次短路再加上u -> v的边,于是考虑Dijkstra算法更新最短路和次短路。

POJ 3225

代码:

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #pragma GCC optimize(4)
  4. #include<cstdio>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<cstring>
  8. #include<vector>
  9. #include<cmath>
  10. #include<queue>
  11. using namespace std;
  12. #define y1 y11
  13. #define fi first
  14. #define se second
  15. #define pi acos(-1.0)
  16. #define LL long long
  17. //#define mp make_pair
  18. #define pb push_back
  19. #define ls rt<<1, l, m
  20. #define rs rt<<1|1, m+1, r
  21. #define ULL unsigned LL
  22. #define pll pair<LL, LL>
  23. #define pli pair<LL, int>
  24. #define pii pair<int, int>
  25. #define piii pair<pii, int>
  26. #define pdd pair<double, double>
  27. #define mem(a, b) memset(a, b, sizeof(a))
  28. #define debug(x) cerr << #x << " = " << x << "\n";
  29. #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  30. //head
  31.  
  32. const int N = 5e3 + ;
  33. vector<pii> g[N];
  34. int d[N], dd[N];
  35. priority_queue<pii, vector<pii>, greater<pii> > q;
  36. int main() {
  37. int n, m, u, v, w;
  38. scanf("%d %d", &n, &m);
  39. for (int i = ; i <= m; ++i) {
  40. scanf("%d %d %d", &u, &v, &w);
  41. g[u].pb({v, w});
  42. g[v].pb({u, w});
  43. }
  44. mem(d, 0x7f);
  45. mem(dd, 0x7f);
  46. d[] = ; //dd[1]不能等于0,n=1且自环的情况
  47. q.push({, });
  48. while(!q.empty()) {
  49. pii p = q.top();
  50. q.pop();
  51. int u = p.se;
  52. if(dd[u] < p.fi) continue;
  53. for (int i = ; i < g[u].size(); ++i) {
  54. int v = g[u][i].fi;
  55. int w = g[u][i].se;
  56. int d1 = p.fi + w;
  57. if(d1 < d[v]) {
  58. swap(d1, d[v]);
  59. q.push({d[v], v});
  60. }
  61. if(d1 < dd[v] && d1 > d[v]) {
  62. dd[v] = d1;
  63. q.push({dd[v], v});
  64. }
  65. }
  66. }
  67. printf("%d\n", dd[n]);
  68. return ;
  69. }

ps:最短路记数也可以用Dijkstra,考虑松弛时如果d[v] > d[u] + w, 那么cnt[v] = cnt[u], 如果d[v] == d[u] + w, 那么cnt[v] += cnt[u]。

3.k短路

A* 或者 可持久化堆

都不会,未完待续。。。

算法笔记--次小生成树 && 次短路 && k 短路的更多相关文章

  1. 最短路 次短路 k短路(k很小)

    最短路 luogu 3371 https://www.luogu.org/problemnew/show/P3371 #include <cstdio> #include <cstd ...

  2. BZOJ1726: [Usaco2006 Nov]Roadblocks第二短路 K短路

    Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样, ...

  3. 疯子的算法总结10--最小生成树Kruscal

    按照权值排序可得,就有如下顺序: 1. 1-2 1 2. 1-4 2 3. 1-5 2 4. 2-5 3 5. 2-3 4 6. 4-5 4 每次选取最小边泉,判断是否同属一个集合,如果不属于同一集合 ...

  4. 算法笔记_079:蓝桥杯练习 区间k大数查询(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表 ...

  5. 次小生成树题(k) poj1679The Unique MST

    http://poj.org/problem?id=1679 #include<iostream> #include<vector> #include<cstdio> ...

  6. URAL 1416 Confidential (最小生成树+次小生成树)

    Description Zaphod Beeblebrox - President of the Imperial Galactic Government. And by chance he is a ...

  7. 沈阳网络赛D-Made In Heaven【k短路】【模板】

    One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. However, Pucci ...

  8. luogu 2483 K短路 (可持久化左偏树)

    题面: 题目大意:给你一张有向图,求1到n的第k短路 $K$短路模板题 假设整个图的边集为$G$ 首先建出以点$n$为根的,沿反向边跑的最短路树,设这些边构成了边集$T$ 那么每个点沿着树边走到点$n ...

  9. 算法笔记_075:蓝桥杯练习 最短路(Java)

    目录 1 问题描述 2 解决方案 2.1 floyd算法解决 2.2 spfa算法解决   1 问题描述 问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环).请你计算从 ...

随机推荐

  1. OO第二单元电梯线程系列总结作业

    电梯系列第一次作业 功能描述: 傻瓜电梯无需考虑超载捎带 线程模式: Producer-Consumer Pattern 思路: 第一次作业是一个傻瓜电梯,分别有一个生产者生成电梯指令(也就是Inpu ...

  2. #WEB安全基础 : HTTP协议 | 0x10 扩展HTTP报文结构概念和内容编码

    #以后的知识都是HTTP协议的扩展,如果精力有限可以选择暂时忽略,注意只是暂时忽略,以后的东西同样重要 HTTP传输数据时可以直接传输也可以对数据进行编码,由于编码在计算机内运行,所以会占用一些CPU ...

  3. vue评论显示隐藏,JavaScript显示关闭

    <template> <div id="vue_det"> <h1>{{details()}}</h1> <div>{{ ...

  4. Emmet:HTML/CSS代码快速编写神器教程

    Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...

  5. Unity3D判断当前所在平台

    Unity3D是一个跨平台的开发工具,支持的平台五花八门,常常开发一款游戏要发布到不同的平台,在不同的平台上会使用不同的代码,难道要我们各平台分别使用一套代码,单独编译一次吗?当然不用了,呵呵.    ...

  6. Django框架详细介绍---Form表单

    一.概述 在HTML页面中,利用form表单向后端提交数据时,需要编写input等输入标签并用form标签包裹起来,与此同时,在很多应用场景之下需要对用户输入的数据校验,例如注册登录页面中,校验用户注 ...

  7. CentOS7中GreVPN的配置

    目前只实现了三层的GRE隧道,但其实二层也可以实现的,但是没有找到很好的方法,待研究 环境如下: host A :  121.207.22.123 host B: 111.2.33.28 1. 在ho ...

  8. spring boot + vue + element-ui全栈开发入门——项目部署

     前言 常用的部署方式有两种: 1.是把生成好的静态页面放到spring boot的static目录下,与打包后的spring boot项目一起发布,当spring boot运行起来后,自然而然就能访 ...

  9. 【Codeforces Round】 #432 (Div. 2) 题解

    Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017)  A. Arpa and a research in Mexi ...

  10. 2018-2019-2 20165215《网络对抗技术》Exp4 恶意代码分析

    目录 实践目标 实践内容 基础问题回答 实验步骤 使用schtasks指令监控系统 使用sysmon工具监控系统 使用VirusTotal分析恶意软件 使用PEiD进行外壳检测 使用PE explor ...