题目传送门

这是一道很好的练习强联通的题目。 首先,从题中可以看到,题目的要求就是要我们求出从起点到终点是否可以经过flag = 1 的边。 由于是无向图,且要求很多,直接暴力dfs会很凌乱。

那么,我们就想到一个思路:能不能尽量把这张图缩小,标记转为点,最好成为一条一条链呢?

tarjan的缩点!!

没错,对于一个环,可以想到,只要这个环中有一条边flag = 1,那么所有的点我们都可以通过falg = 1的边到达(因为这是环)。所以,不妨进行tarjan缩点,只要这个缩点中有一条边falg = 1,我们就把这个缩点打上tag。

再一想,经过缩点之后,原来十分凌乱的图就变成了一棵树。到达终点的路线也就只有固定一条了。这里我选择dfs。

思路大体就是这样,总时间复杂度O(M + N)

话不多说,具体细节操作标记在代码里面了。

#include<bits/stdc++.h>
using namespace std;
#define N 500010
#define isdigit(c) ((c)>='0'&&(c)<='9') inline int read(){
int x = ,s = ;
char c = getchar();
while(!isdigit(c)){
if(c == '-') s = -;
c = getchar();
}
while(isdigit(c)){
x = (x << ) + (x << ) + (c ^ '');
c = getchar();
}
return x * s;
} int n, m;
struct node{
int u, v, flag;
int next;
} t[N << ];
int f[N];//日常邻接表 int s, ht;//起点, 终点
int dfn[N], low[N], scc[N]; //scc即为缩点后每个缩点的编号
stack <int> stac;//缩点用的
bool vis[N];//一个点是否被经过 int bian = ;
void add(int u, int v, int flag){
bian++;
t[bian].u = u;
t[bian].v = v;
t[bian].flag = flag;
t[bian].next = f[u];
f[u] = bian;
return ;
} int cnt = , cac;//cac为强联通的数量
void tarjan(int now, int fa){//无向图的tarjan强联通 板子
dfn[now] = low[now] = ++cnt;
vis[now] = ;
stac.push(now);
for(int i = f[now]; i;i = t[i].next){
int v = t[i].v;
if(v != fa){
if(!dfn[v]){
tarjan(v, now);
low[now] = min(low[now], low[v]);
}
else if(vis[v])low[now] = min(low[now], low[v]);
}
}
if(dfn[now] == low[now]){
int cur;
cac++;
do{
cur = stac.top();
stac.pop();
scc[cur] = cac;
vis[cur] = ;
}while(cur != now);
}
return ;
} bool tong[N]; //tong为每个缩点被打上的标记,即上文所说的,是否包含flag = 1的边
void dfs(int now, bool flag){
if(tong[now])flag = ;//这个缩点标记为1的话,记下来
if(now == scc[ht]){
if(flag)puts("YES");//搜到终点,没什么好说的
else puts("NO");
return ;
}
for(int i = f[now]; i;i = t[i].next){
int v = t[i].v, u = t[i].u;
if(!vis[v]){
vis[v] = ;
dfs(v, flag | t[i].flag);//这里要注意不要漏掉了缩点与缩点之间的边的 flag
}
}
return ;
} int main(){
n = read(), m = read();
for(int i = ;i <= m; i++){
int x = read(), y = read(), tag = read();
add(x, y, tag);add(y, x, tag);
}
s = read() , ht = read();
tarjan(, );
for(int i = ;i <= bian; i += ){
if(scc[t[i].u] == scc[t[i].v] && t[i].flag){
tong[scc[t[i].u]] = ;//为强联通分量中的边,且flag = 1
}
}
memset(f, , sizeof(f));//重复利用
bian = ;
memset(vis, , sizeof(vis));
for(int i = ;i <= m << ; i++){
int u = t[i].u, v = t[i].v;
if(scc[u] != scc[v]){
add(scc[u], scc[v], t[i].flag);//不同缩点之间的连边,需要保留。flag不能改
}
}
vis[scc[s]] = ;
dfs(scc[s], );//dfs的都是缩点,这点不要忘了
return ;
}

CF652E Pursuit For Aritifacts的更多相关文章

  1. Robust PCA via Outlier Pursuit

    目录 引 主要结果 定理1 定理2 理论证明 构造Oracle Problem 算法 Xu H, Caramanis C, Sanghavi S, et al. Robust PCA via Outl ...

  2. Subway Pursuit (二分)(交互题)

    题目来源:codeforces1039B Subway Pursuit 题目大意: 在1到n里有一个运动的点,要求找到这个点,每次可以查询一个区间内有没有这个点,每次这个点往左或者往右移动1到k个位置 ...

  3. 观后感|当幸福来敲门 The Pursuit of Happyness

    更好的阅读体验请点击:当幸福来敲门 The Pursuit of Happyness 看到时光机点亮的那一刻,我想儿子克里斯托夫正在侏罗纪的世界内探险,看着山川河流,穿梭在恐龙的脚下,在山洞中安稳的度 ...

  4. Pursuit For Artifacts CodeForces - 652E (Tarjan+dfs)

    Pursuit For Artifacts CodeForces - 652E Johnny is playing a well-known computer game. The game are i ...

  5. Projection Pursuit Regression----读书笔记

    The central idea is to extract linear combinations of the inputs as derived features, and then model ...

  6. codeforces 652E Pursuit For Artifacts 边双连通分量

    题意:n个点,m条边的无向图,有的边上有标记,每条边只能走一次 给你一个起点,一个终点,询问是否能找到从起点到终点的路径,这条路径至少包含一条含有标记的边 分析:然后边双缩点 下面介绍一下边双的性质 ...

  7. codeforces 652E . Pursuit For Artifacts 强连通分量

    题目链接 题目大意: 给一个图, n个点m条边, 某些边上面有权值. 一条边只能走一次, 给两个点s, t. 问你, 从s到t能否经过有权值的边. 首先肯定要缩点, 然后看同一个连通分量里面的边, 是 ...

  8. Educational Codeforces Round 10 E - Pursuit For Artifacts (强联通缩点 + 回溯)

    题目链接:http://codeforces.com/contest/652/problem/E 给你n个点m个边,x和y双向连接,要是z是1表示这条边上有宝藏,0则没有,最后给你起点和终点,问你要是 ...

  9. Pursuit For Artifacts CodeForces - 652E

    https://vjudge.net/problem/CodeForces-652E 边双啊,就是点双那个tarjan里面,如果low[v]==dfn[v](等同于low[v]>dfn[u]), ...

随机推荐

  1. Entity Framework使用EntityState和Attach来保存数据变化以及更新实体的个别字段

    在使用Entity Framework作为ORM来存取数据的过程中,最常规的操作就是对数据对象的更新.本文将会包含如何Attach Entity到一个数据Context中,以及如何使用EntitySt ...

  2. 题解 CF1286A 【Garland】

    updata on 2020.3.19 往博客园搬的时候看了看自己以前写的blog 其实没多久,才两个多月,感觉自己之前写的东西好罗嗦啊.. 但也是最近写的blog才开始多起来 当然现在也没好到哪去. ...

  3. spring cloud系列教程第一篇-介绍

    spring cloud系列教程第一篇-介绍 前言: 现在Java招聘中最常见的是会微服务开发,微服务已经在国内火了几年了,而且也成了趋势了.那么,微服务只是指spring boot吗?当然不是了,微 ...

  4. 复数(complex)

    表示复数信息 a = 12.3+4j print('a的类型为:', type(a)) # 运行结果:a的类型为: <class 'complex'> print(a.real) # 实部 ...

  5. E. Kamil and Making a Stream 区间gcd

    E. Kamil and Making a Stream 这个题目要用到一个结论,就是区间一个区间长度为n的不同的gcd不会超过logn 个, 其实就是知道这个题目可以暴力就好了. 然后就是对于每一个 ...

  6. restful 架构风格的curd(增删改查)

    restful架构 概念:REST指的是一组架构约束条件和原则,如果一个架构符合REST的约束条件和原则,就称之为RESTful架构. restful不是一个专门的技术,他是一个规范.规范就是写写代码 ...

  7. 什么情况下不能使用 Java 泛型

    1. 前言 Java 1.5 引入了泛型来保证类型安全,防止在运行时发生类型转换异常,让类型参数化,提高了代码的可读性和重用率.但是有些情况下泛型也是不允许使用的,今天就总结一下编码中不能使用泛型的一 ...

  8. 自动扫雷 python

    自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. // 2018.8.10更新 代码已上传至GitHub https://gith ...

  9. 07JAVA基础面向对象-继承/多态

    一.继承 1.概念 子类的共性 重用现有类并在此基础上进行扩展 public class 子类 extends 父类{} 2.继承中的成员访问 成员变量 成员方法 局部->本类中成员变量-> ...

  10. SpringBatch异常To use the default BatchConfigurer the context must contain no more thanone DataSource

    SpringBoot整合SpringBatch项目,已将代码开源至github,访问地址:https://github.com/cmlbeliever/SpringBatch 欢迎star or fo ...