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]), ...
随机推荐
- 重新认识 Spring IOC
spring IOC 剖析 再品IOC与DI IOC(Inversion of Control) 控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创 建.依赖的代码,反转给容器来帮忙实现. ...
- 如何对Code Review的评论进行分级
我曾写过一篇关于Code Review的文章<Code Review 最佳实践>,在文章中建议对Code Review的评论进行分级: 建议可以对Review的评论进行分级,不同级别的结果 ...
- Jmeter系列(9)- jmeter插件入门篇
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 jmeter4.0以上,如现在最 ...
- springboot中json转换LocalDateTime失败的bug解决过程
环境:jdk1.8.maven.springboot 问题:前端通过json传了一个日期:date:2019-03-01(我限制不了前端开发给到后端的日期为固定格式,有些人就是这么不配合), ...
- spring表达式语言
使用文本表达式 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http: ...
- MOD3干扰
1.MOD3干扰的定义 MOD3干扰也称模3干扰,是LTE网络内干扰的一种形式,要了解这种干扰的产生原理,就要从小区PCI入手. PCI全称PhysicalCellIdentifier,即物理小区标识 ...
- 【HBase】通过Java代码实现HBase数据库中数据的增删改查
目录 创建maven工程,导入jar包 java代码实现创建hbase表 java代码实现向hbase表中插入数据 java代码查询hbase数据 使用rowKey查询指定列族指定列的值 通过star ...
- Ubuntu 18.04 新系统 允许root远程登录
1. 查看ssh服务器是否安装并启动 #sudo ps -e | grep ssh 1. 安装ssh服务器 #sudo apt-get install openssh-server 2. 配置sshd ...
- 错误提示 Table '.***_ecms_news_data_' doesn't exist select keyid,dokey,newstempid,closepl,info
错误提示:Table '**.***_ecms_news_data_' doesn't exist select keyid,dokey,newstempid,closepl,infotags,wri ...
- Mysql 常用数据库操作
一.数据库操作: 1.查看数据库: >SHOW DATABASES; 2.创建数据库: >CREATE DATABASE db_name; //db_name为数据库名 3.使用数据库: ...