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

tarjan缩点 + SPFA

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

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

#include <queue>
#include <stack>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000000 + 10;
const int inf = 0x7fffffff;
struct edge{
int from, to, next, len;
}e1[maxn<<2], e2[maxn<<2];
int head1[maxn], head2[maxn], cnt1, cnt2;
int dfn[maxn], low[maxn], dis[maxn], tim;
bool vis1[maxn], vis2[maxn];
int n, m, color[maxn], num;
stack<int> s;
queue<int> q;
void add1(int u, int v, int w)
{
e1[++cnt1].from = u;
e1[cnt1].len = w;
e1[cnt1].next = head1[u];
e1[cnt1].to = v;
head1[u] = cnt1;
}
void add2(int u, int v, int w)
{
e2[++cnt2].from = u;
e2[cnt2].len = w;
e2[cnt2].next = head2[u];
e2[cnt2].to = v;
head2[u] = cnt2;
}
void tarjan(int x)
{
dfn[x] = low[x] = ++tim;
s.push(x); vis1[x] = 1;
for(int i = head1[x]; i != -1; i = e1[i].next)
{
int v = e1[i].to;
if(!dfn[v])
{
tarjan(v);
low[x] = min(low[x], low[v]);
}
else if(vis1[v])
{
low[x] = min(low[x], low[v]);
}
}
if(low[x] == dfn[x])
{
color[x] = ++num;
vis1[x] = 0;
while(s.top() != x)
{
color[s.top()] = num;
vis1[s.top()] = 0;
s.pop();
}
s.pop();
}
}
void SPFA()
{
while(!q.empty())
{
int now = q.front(); q.pop();
vis2[now] = 0;
for(int i = head2[now]; i != -1; i = e2[i].next)
{
int v = e2[i].to;
if(dis[v] > dis[now] + e2[i].len)
{
dis[v] = dis[now] + e2[i].len;
if(!vis2[v])
{
q.push(v);
vis2[v] = 1;
}
}
}
}
}
int main()
{
memset(head1, -1, sizeof(head1));
memset(head2, -1, sizeof(head2));
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++) dis[i] = inf;
for(int i = 1; i <= m; i++)
{
int u, v, w;
scanf("%d%d%d",&u,&v,&w);
add1(u,v,w);
}
for(int i = 1; i <= n; i++)
if(!dfn[i]) tarjan(i);
for(int i = 1; i <= n; i++)
for(int j = head1[i]; j != -1; j = e1[j].next)
{
int v = e1[j].to;
if(color[v] != color[i])
add2(color[i], color[v], e1[j].len);
}
q.push(color[1]);
dis[color[1]] = 0;
vis2[color[1]] = 1;
SPFA();
printf("%d",dis[color[n]]);
}

【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. 编程中经常看到上下文context,这个上下文指得是什么?

    举个栗子:小美气呼呼对我说:“你去死吧”,我当时哭了. 场景1:小美刚转学到我们学校,我暗恋了她很久,有一天鼓足勇气,向她表白,小美气呼呼对我说:“你去死吧”,我当时就哭了.场景2我跟小美从小青梅竹马 ...

  2. 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  3. mysql安装 2018最新安装mysql教程及遇到的问题解决Windows下

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8094659.html 今天因为换了个LINUX系统 把我的E盘不小心给卸载了 结果还是不能用 ...

  4. Win10内置应用恢复初始状态

    和Win8/Win8.1相同,Win10也内置了很多默认Windows应用,比如计算器.天气.人脉.Groove音乐.电影和电视.邮件和日历.Edge浏览器等.一般情况下,这些应用不会有太大的问题,但 ...

  5. 关于如何绕开对通用VMware虚拟机检测的一些收集

    1,用记事本打开虚拟系统镜像文件的配置文件,这个文件扩展名为vmx,比如我的虚拟系统名为XP,那这个文件就叫XP.vmx,然后在其末尾添加这么一句,如下红色部分(注意,虚拟机不能在运行状态添加) mo ...

  6. HashTable 元素的查找

    Hashtable 特点:键与值成对存在,键是唯一的,不能重复.在查找元素的时候,我们往往是依据键区查找值的 三种方法 contains   包含 containsKey containsValue ...

  7. C# string Stream 互转

    使用C#将字符串转化成流,将流转换成字符串,代码如下: using System.IO; using System.Text; namespace CSharpConvertString2Stream ...

  8. Quartz使用及注意事项

    Quartz使用及注意事项 前提:目前由于公司业务决定,大量使用Quartz,每天固定的时间点执行相应的业务逻辑,,几十个时间点应该是有的,某一个时间点如果没有执行带来的问题是巨大的.Quartz的稳 ...

  9. 面试基础(二)-mem函数

    常考的函数有下面三个,memset,memcpy,memmove,一定要记住三个函数的函数原型,熟记返回值类型和参数类型,当然也不能忘记参数检查   memset #include<iostre ...

  10. 梁宇轩 mysql 语句学习一 对表的操作

    1.SHOW TABLES;           -- 查询库中所有的表 2 .CREATE TABLE test(id INT(20) PRIMARY KEY NOT NULL AUTO_INCRE ...