题目链接: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. poi excel 常用api

    http://www.cnblogs.com/huajiezh/p/5467821.html

  2. Eclipse设置JVM的内存参数

    打开Eclipse 或者 MyEclipse 打开 Windows -> Preferences -> Java -> Installed JREs 选中你所使用的 JDK,然后点击 ...

  3. [转]python中对文件、文件夹的操作——os模块和shutil模块常用说明

    转至:http://l90z11.blog.163.com/blog/static/187389042201312153318389/ python中对文件.文件夹的操作需要涉及到os模块和shuti ...

  4. import java.util.Collections类

    Collections类提供了一些操作集合的方法  下面介绍几个方法 1.将集合变为线程安全的 三个方法分别对应了ArrayList,HashMap,HashSet: Collections.sync ...

  5. Tomcat 启动很慢?

    Tomcat 8启动很慢,在启动中, 发现加载如下类时很慢: org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 原因 ...

  6. jQuery autocomplete 应用

    1. 引入css和js <link rel="stylesheet" href="{{ url_for('static', filename='jquery.aut ...

  7. solidity合约面向对象

    1. 属性[状态变量]的访问权限 public  internal[合约属性默认的权限]  private 说明:属性默认访问全向为internal,internal和private类型的属性,外部是 ...

  8. springBoot 中redis 注解缓存的使用

    1,首先在启动类上加上 @EnableCaching 这个注解 在查询类的controller,或service ,dao 中方法上加 @Cacheable 更新或修改方法上加 @CachePut 注 ...

  9. OLEDB 枚举数据源

    在之前的程序中,可以看到有这样一个功能,弹出一个对话框让用户选择需要连接的数据源,并输入用户名和密码,最后连接:而且在一些数据库管理软件中也提供这种功能--能够自己枚举出系统中存在的数据源,同时还可以 ...

  10. express 请求跨域后端解决方法CORS

    CORS全称Cross-Origin Resource Sharing,是HTML5规范定义的如何跨域访问资源. Origin表示本域,也就是浏览器当前页面的域.当JavaScript向外域(如sin ...