CF652E Pursuit For Aritifacts
这是一道很好的练习强联通的题目。 首先,从题中可以看到,题目的要求就是要我们求出从起点到终点是否可以经过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的更多相关文章
- Robust PCA via Outlier Pursuit
目录 引 主要结果 定理1 定理2 理论证明 构造Oracle Problem 算法 Xu H, Caramanis C, Sanghavi S, et al. Robust PCA via Outl ...
- Subway Pursuit (二分)(交互题)
题目来源:codeforces1039B Subway Pursuit 题目大意: 在1到n里有一个运动的点,要求找到这个点,每次可以查询一个区间内有没有这个点,每次这个点往左或者往右移动1到k个位置 ...
- 观后感|当幸福来敲门 The Pursuit of Happyness
更好的阅读体验请点击:当幸福来敲门 The Pursuit of Happyness 看到时光机点亮的那一刻,我想儿子克里斯托夫正在侏罗纪的世界内探险,看着山川河流,穿梭在恐龙的脚下,在山洞中安稳的度 ...
- Pursuit For Artifacts CodeForces - 652E (Tarjan+dfs)
Pursuit For Artifacts CodeForces - 652E Johnny is playing a well-known computer game. The game are i ...
- Projection Pursuit Regression----读书笔记
The central idea is to extract linear combinations of the inputs as derived features, and then model ...
- codeforces 652E Pursuit For Artifacts 边双连通分量
题意:n个点,m条边的无向图,有的边上有标记,每条边只能走一次 给你一个起点,一个终点,询问是否能找到从起点到终点的路径,这条路径至少包含一条含有标记的边 分析:然后边双缩点 下面介绍一下边双的性质 ...
- codeforces 652E . Pursuit For Artifacts 强连通分量
题目链接 题目大意: 给一个图, n个点m条边, 某些边上面有权值. 一条边只能走一次, 给两个点s, t. 问你, 从s到t能否经过有权值的边. 首先肯定要缩点, 然后看同一个连通分量里面的边, 是 ...
- Educational Codeforces Round 10 E - Pursuit For Artifacts (强联通缩点 + 回溯)
题目链接:http://codeforces.com/contest/652/problem/E 给你n个点m个边,x和y双向连接,要是z是1表示这条边上有宝藏,0则没有,最后给你起点和终点,问你要是 ...
- Pursuit For Artifacts CodeForces - 652E
https://vjudge.net/problem/CodeForces-652E 边双啊,就是点双那个tarjan里面,如果low[v]==dfn[v](等同于low[v]>dfn[u]), ...
随机推荐
- Java——Spring常用jar包功能详解
很多小伙伴包括我自己,在使用spring的时候导入了一堆jar包,但是并不明白每个jar的用途,使用spring的不同功能时也不知该导入哪个jar包,今天记录一下spring各个jar包的含义,供大家 ...
- 数位dp H - F(x) HDU - 4734
http://acm.hdu.edu.cn/showproblem.php?pid=4734 一般数位dp表示的是数的性质,这个题目也是一样,但是我们求出来的是一个函数的值,怎么把这个值转化成一类数, ...
- JDK基本库概述
看脚下,不断行,莫存顺逆. 剖析java的哪些源码 目前主要是java基本库的一些源码的分析,jvm工具的使用等等,后续可能还会结合hotspot源码来分析jvm原理,当然,这是一个比较高级的主题,根 ...
- js中刷新页面的方式总结
1.window.onload / document.onload 2.history.go(num): (1)num为参数,num为正表示前进几个页面,类似于history.forward(): ( ...
- linux centos7搭建redis-5.0.5
1. 下载redis 1.1 下载地址 http://download.redis.io/releases/ 1.2 安装版本 redis-5.0.5.tar.gz 2. 安装redis 2.1 前置 ...
- [POJ1038]状压DP
题意:给一个n*m的区域,里面有一些障碍物,往里面放2*3和3*2的矩形,矩形之间不能重叠,不能覆盖到障碍物,求能放置的最大个数.(n<=150,m<=10) 思路:看到m=10就应该往状 ...
- [hdu4497]分解质因数
题意:求满足gcd(x,y,z)=G,lcm(x,y,z)=L的x,y,z的解的个数. 大致思路:首先如果L % G != 0那么无解,否则令u = L / G,问题变为,gcd(r,s,t)=1,l ...
- Asp.Net Core 3.1学习-读取、监听json配置文件(7)
1.前言 文件配置提供程序默认的给我们提供了ini.json.Xml等.都是读取不同格式的文件.文件配置提供程序支持文件可寻.必选.文件变更的监视. 2.读取配置文件 主要运用的包:需要Ini.xml ...
- Akko海洋之星
今天(2020.5.14)入手Akko海洋之星84茶轴,开心呀~~ 考虑方面: 价格>键线分离>接线接口>轴体>键帽>材质 价格: 200~500之间入门级cherry轴 ...
- 最近常问的99道Java多线程面试题 !
前言 今天给大家更新的是一篇关于多线程面试的文章,也是霸哥根据时下热门的面试内容给大家进行总结的, 本篇文章属于干货内容! 请各位读者朋友一定要坚持读到最后,完整阅读本文后相信你对多线程会有不一样感悟 ...