题目链接:https://www.luogu.org/problemnew/show/P2169

tarjan缩点 + SPFA

缩完点之后加边注意别写错。

也可以不用建两个图,可以在一张图上判断是否强连通再SPFA.

  1. #include <queue>
  2. #include <stack>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8. const int maxn = 1000000 + 10;
  9. const int inf = 0x7fffffff;
  10. struct edge{
  11. int from, to, next, len;
  12. }e1[maxn<<2], e2[maxn<<2];
  13. int head1[maxn], head2[maxn], cnt1, cnt2;
  14. int dfn[maxn], low[maxn], dis[maxn], tim;
  15. bool vis1[maxn], vis2[maxn];
  16. int n, m, color[maxn], num;
  17. stack<int> s;
  18. queue<int> q;
  19. void add1(int u, int v, int w)
  20. {
  21. e1[++cnt1].from = u;
  22. e1[cnt1].len = w;
  23. e1[cnt1].next = head1[u];
  24. e1[cnt1].to = v;
  25. head1[u] = cnt1;
  26. }
  27. void add2(int u, int v, int w)
  28. {
  29. e2[++cnt2].from = u;
  30. e2[cnt2].len = w;
  31. e2[cnt2].next = head2[u];
  32. e2[cnt2].to = v;
  33. head2[u] = cnt2;
  34. }
  35. void tarjan(int x)
  36. {
  37. dfn[x] = low[x] = ++tim;
  38. s.push(x); vis1[x] = 1;
  39. for(int i = head1[x]; i != -1; i = e1[i].next)
  40. {
  41. int v = e1[i].to;
  42. if(!dfn[v])
  43. {
  44. tarjan(v);
  45. low[x] = min(low[x], low[v]);
  46. }
  47. else if(vis1[v])
  48. {
  49. low[x] = min(low[x], low[v]);
  50. }
  51. }
  52. if(low[x] == dfn[x])
  53. {
  54. color[x] = ++num;
  55. vis1[x] = 0;
  56. while(s.top() != x)
  57. {
  58. color[s.top()] = num;
  59. vis1[s.top()] = 0;
  60. s.pop();
  61. }
  62. s.pop();
  63. }
  64. }
  65. void SPFA()
  66. {
  67. while(!q.empty())
  68. {
  69. int now = q.front(); q.pop();
  70. vis2[now] = 0;
  71. for(int i = head2[now]; i != -1; i = e2[i].next)
  72. {
  73. int v = e2[i].to;
  74. if(dis[v] > dis[now] + e2[i].len)
  75. {
  76. dis[v] = dis[now] + e2[i].len;
  77. if(!vis2[v])
  78. {
  79. q.push(v);
  80. vis2[v] = 1;
  81. }
  82. }
  83. }
  84. }
  85. }
  86. int main()
  87. {
  88. memset(head1, -1, sizeof(head1));
  89. memset(head2, -1, sizeof(head2));
  90. scanf("%d%d",&n,&m);
  91. for(int i = 1; i <= n; i++) dis[i] = inf;
  92. for(int i = 1; i <= m; i++)
  93. {
  94. int u, v, w;
  95. scanf("%d%d%d",&u,&v,&w);
  96. add1(u,v,w);
  97. }
  98. for(int i = 1; i <= n; i++)
  99. if(!dfn[i]) tarjan(i);
  100. for(int i = 1; i <= n; i++)
  101. for(int j = head1[i]; j != -1; j = e1[j].next)
  102. {
  103. int v = e1[j].to;
  104. if(color[v] != color[i])
  105. add2(color[i], color[v], e1[j].len);
  106. }
  107. q.push(color[1]);
  108. dis[color[1]] = 0;
  109. vis2[color[1]] = 1;
  110. SPFA();
  111. printf("%d",dis[color[n]]);
  112. }

【luogu P2169 正则表达式】 题解的更多相关文章

  1. [Luogu 2169] 正则表达式

    [Luogu 2169] 正则表达式 感谢 0xis 推题. 记忆中很久没有过一遍写过一题了- 别被题目名称蒙骗!这不是正则表达式题目!和字符(串)处理一点关系都没有!这是个图论题啊喂! 题都没急,C ...

  2. 洛谷——P2169 正则表达式

    P2169 正则表达式 题目背景 小Z童鞋一日意外的看到小X写了一个正则表达式的高级程序,这个正则表达式程序仅仅由字符“0”,“1”,“.”和“*”构成,但是他能够匹配出所有在OJ上都AC的程序的核心 ...

  3. P2169 正则表达式

    题目背景 小Z童鞋一日意外的看到小X写了一个正则表达式的高级程序,这个正则表达式程序仅仅由字符“0”,“1”,“.”和“*”构成,但是他能够匹配出所有在OJ上都AC的程序的核心代码!小Z大为颇感好奇, ...

  4. 【luogu P3946 ことりのおやつ】 题解

    题目链接:https://www.luogu.org/problemnew/show/P3946 交好几遍是因为虽然能过一直有提醒..强迫症qwq #include <bits/stdc++.h ...

  5. 洛谷P2169 正则表达式

    题目背景 小\(Z\)童鞋一日意外的看到小\(X\)写了一个正则表达式的高级程序,这个正则表达式程序仅仅由字符"\(0\)","\(1\)","\(. ...

  6. Luogu P2210 Haywire 题解

    其实这题吧...有一种玄学解法 这题的要求的就是一个最小化的顺序 那么,我们就不进想到了一种显然的写法 就是random_shuffle 什么?这不是乱搞的非正解吗 然而,正如一句话说的好 一个算法, ...

  7. [Luogu P4178]Tree 题解(点分治+平衡树)

    题目大意 给定一棵树,边带权,问有多少点对满足二者间距离$\leq K$,$n \leq 40000$. 题解 点分治专题首杀!$Jackpot!$ (本来看着题意比较简单想捡个软柿子捏,结果手断了… ...

  8. [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)

    前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...

  9. Luogu P2158 仪仗队 题解报告

    题目传送门 [题目大意] 给定一个n×n的点方阵,求站在左下角的点能看到的点数 注意同一条直线上只能看到一个点 [思路分析] 因为是一个方阵,所以可以对称地算,那么对于半个方阵,这里假设是左上的半个方 ...

随机推荐

  1. 3d旋转卡牌

    做成向中心缩放就行了,和旋转效果一样的

  2. 搭架Ubuntu的 apt-cacher服务

    源服务器名称可能不太准确,意思是创建内网自己的私服,这样只要有Ubuntu通过该私服下载安装过软件,私服都会缓存,下一个Ubuntu的请求就直接从缓存中获取. 最近Ubuntu源服务器太慢了,北京的网 ...

  3. C#下查找并杀死子进程(进程树)

    参考:如何杀死进程及子进程 /** * 传入参数:父进程id * 功能:根据父进程id,杀死与之相关的进程树 */ public static void KillProcessAndChildren( ...

  4. Nginx+Keepalived配置

    1. Nginx安装 (1) 环境:分别在2台服务器上部署nginx且步骤一致: 如192.138.86.1和192.138.86.2 (2) 下载官网最新稳定版,地址:https://nginx.o ...

  5. 【iptables】规则的试验和查看

    1.存在桥接,查看桥接访客网络规则 ebtables -L 可以看到对不同的链的策略

  6. 解决The current branch is not configured for pull No value for key branch.master.merge found in config

    使用Git Pull项目的时候出现这个问题: The current branch is not configured for pull No value for key branch.master. ...

  7. 使用IDEA创建java项目(hello word)

    前提:已安装好jdk,配置好环境变量.我使用的是java 8. 首先在自己的D盘下建一个文件夹,用来存放我们待会新建的项目,我创建了IdeaProject: 1,第一步打开idea 第二步选择创建ja ...

  8. 用于模式匹配的String方法和RegExp方法

    上一节总结了创建正则表达式的语法,这一篇笔者总结了用于模式匹配的String四个方法:search().replace().match().split()以及用于模式匹配的RegExp两个方法exec ...

  9. 关于hibernate的一点心得

    1.部门和员工的关系: 部门<->员工是一对多的关系,即一个部门有多个员工,所以员工表里有部门id:depart_id 在下面这个代码中各添加部门和员工的一个记录即:新增一个部门,同时这个 ...

  10. 菜鸟学习Spring——SpringMVC注解版控制层重定向到控制层

    一.概述. SpringMVC中界面请求Contorller1,Contorller1需要重定向到Contorller2中显示其他页面或者做一些业务逻辑,Spring中提供了这个功能利用"r ...