学习了一下最短路的姿势,这个建图方法好妙啊,虽然不会证明正确性……

#include <bits/stdc++.h>
#define N 220000
#define INF 1000000000
using namespace std;
int n, m;
int ai[N], bi[N], ci[N], di[N];
int check;
class DIJ
{
private:struct node {int t, d;};struct comp {int operator () (node a, node b) {return a.d > b.d;}};priority_queue <node, vector <node>, comp> Q;
public:vector <int> bi[N], ci[N];int dis[N], vis[N], pre[N];int tot;void build(int a, int b, int c){bi[a].push_back(b); ci[a].push_back(c);//if (check) printf("%d %d %d\n",a,b,c);
    }void solve(){for (int i = 2; i <= tot; ++ i) dis[i] = INF, vis[i] = 0;dis[1] = vis[1] = 0;Q.push((node){1, 0});while (!Q.empty()){int hd;do hd = Q.top().t, Q.pop();while (vis[hd] && !Q.empty());if (vis[hd]) break; else vis[hd] = 1;for (int j = 0; j < bi[hd].size(); ++ j)if (dis[hd] + ci[hd][j] < dis[bi[hd][j]]){dis[bi[hd][j]] = dis[hd] + ci[hd][j];pre[bi[hd][j]] = hd == 1? bi[hd][j]: pre[hd];Q.push((node){bi[hd][j], dis[bi[hd][j]]});}}}
} A, B;
int tot, ans = INF, bac = INF, pp;
int main()
{scanf("%d%d", &n, &m); A.tot = n; B.tot = n + 1;for (int i = 1; i <= m; ++ i) {int a, b, c, d;scanf("%d%d%d%d", &a, &b, &c, &d);tot ++; ai[tot] = a; bi[tot] = b; ci[tot] = c;tot ++; ai[tot] = b; bi[tot] = a; ci[tot] = d;A.build(a, b, c);A.build(b, a, d);if (a == 1 || b == 1) if (bac > c + d) bac = c + d, pp = (a == 1? b: a);}A.solve();A.dis[1] = bac; A.pre[1] = pp;check = 1;for (int i = 1; i <= tot; ++ i){if (ai[i] == 1){if (A.pre[bi[i]] != bi[i])B.build(1, bi[i], ci[i]);}else if (bi[i] == 1){if (A.pre[ai[i]] != ai[i])B.build(1, n + 1, A.dis[ai[i]] + ci[i]);else B.build(ai[i], n + 1, ci[i]);}else if (A.pre[ai[i]] != A.pre[bi[i]])B.build(1, bi[i], A.dis[ai[i]] + ci[i]);else B.build(ai[i], bi[i], ci[i]);}B.solve();printf("%d\n", B.dis[n + 1]);
}

转载于:https://www.cnblogs.com/AwD-/p/6257803.html

bzoj 4398:福慧双修相关推荐

  1. bzoj 4398 福慧双修——二进制分组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 如果枚举1号点走哪些点出去,就从那些点出发跑多源最短路即可.最短路不会重复经过一条边. ...

  2. BZOJ 2407: 探险/BZOJ 4398: 福慧双修 dijkstra 构造

    2407: 探险 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 170  Solved: 95 [Submit][Status][Discuss] ...

  3. bzoj 4398 福慧双修 —— 二进制分组+多起点最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 按二进制每一位是 0/1 把 1 号点的儿子分成两组,分别作为起点和终点跑多起点最短路 ...

  4. bzoj 4398 福慧双修 题解

    卡了一晚上啊 首先我们要跑一边整张图的spfa,记录每个点是从哪条边出去的(pre数组) 这里记录的不是前驱边,而是和原点相连的第一个点编号,因为不能走重复边所以才要记录这个,以免刚刚出去又原路返回 ...

  5. bzoj 4398: 福慧双修(最短路建模/构造)

    简述题意: 给定一个有向图,对于连接同两个点的边算作同一条,问不经过重复边的最小正权环. 保证没有重边(这个是指有向的),没有自环. 算法:最短路+构造 难度:NOIP+ 题解: 有一种暴力的思路,感 ...

  6. BZOJ 2407: 探险/4398: 福慧双修

    2407: 探险 Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明 ...

  7. BZOJ4398: 福慧双修【二进制分组+最短路】

    4398: 福慧双修 考虑笨蛋,我们可以枚举出边,然后Dij就可以了. 显然在菊花图的情况下要T 我们考虑分组,对于连1的边,一半强制为出边,一半强制为入边,跑DIJ,然后交换,再做一遍. 然后继续分 ...

  8. BZOJ2407/4398:探险/福慧双修(最短路)

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  9. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

最新文章

  1. python时间处理模块datetime+dateutil、numpy时间处理模块datetime64以及pandas时间处理模块Timestamp的演化路径及常用处理接口
  2. 一般web放在linux那个目录下,web.py应该安装在linux的哪个目录下?
  3. file watchers怎么默认打开_Python读写文件怎么和我之前学的不一样?
  4. 18. javacript高级程序设计-JavaScript与XML
  5. jQuery的操作css的几种方法和位置,尺寸以及scrolltop方法
  6. C++ IO常用读写操作
  7. linux中python进程,如何检查进程在python中运行(在linux中)?
  8. 设置透明色有残留怎么办_冬天车玻璃结冰,车被冻住了怎么办?据说只有10%的人做对了...
  9. 煤矿调度计算机使用管理制度,煤矿调度文档管理制度(参考).doc
  10. 解决ValueError: x and y must have same first dimension,
  11. 十行以内,你写过哪些比较酷的 Matlab 代码?
  12. C++面向对象程序设计:银行储蓄管理系统
  13. 晶体DSX321G被公认的车载晶振在无人货车上也将功能发挥的淋漓精致
  14. Linux ln -sfn命令
  15. msp430流水灯c语言程序,MSP430单片机流水灯程序
  16. xcode 工程常见问题
  17. Unix编程/应用问答中文版(转)
  18. 2022年舞台造雪机市场前景分析及研究报告
  19. My97DatePicker 使用及配置
  20. 如何搭建一个自己的网站

热门文章

  1. 4G网速变慢?工信部回应:近期全国4G网速整体保持稳定
  2. 设计模式学习笔记--享元(Flyweight)模式
  3. Flask路由分发及转换器
  4. 【专业英语】计算机英语词汇Day6
  5. 使用Docker国内镜像源
  6. 报Preference node org.eclipse.wst.validation
  7. 超150亿元市场启动!智能汽车中间件出圈背后仍存挑战
  8. 自定义Maven Archetype模板工程
  9. 51单片机入门模板(STC89C52RC)
  10. Java8两个list集合合并成一个list集合