AT3945-[ARC092D]Two Faced Edges【dfs】
正题
题目链接:https://www.luogu.com.cn/problem/AT3945
题目大意
\(n\)个点\(m\)条边的一张图,对于每条边求它翻转后强连通分量数量是否变化。
\(1\leq n\leq 1000,1\leq m\leq 2\times 10^5\)
解题思路
对于一条\((x,y)\)的边。
- 如果原来\(y\)能走到\(x\),那么考虑现在是否强连通分量是否减少,就是说如果存在一条\(x->y\)的路径不经过这条边那么不变,否则减少。
- 如果原来\(y\)不能走到\(x\),那么考虑现在强连通分量是否增加,那么如果存在一条\(x->y\)的路径不经过这条边那么就会产生一个新的强连通分量。
考虑每一个\(x\)能否走到\(y\),这个直接暴力\(O(nm)\)预处理就好了。
然后考虑对于每条边\(x,y\),\(x\)能否不经过这条边走到\(y\),从\(x\)开始\(dfs\),记录出去的第一条边,然后如果到一个点有两种不同情况那么标记即可。
时间复杂度\(O(nm)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e3+10,M=2e5+10;
int n,m,f[N][N],g[N][N],X[M],Y[M];
vector<int> a[N];
void step(int x,int *v){
if(v[x])return;v[x]=1;
for(int i=0;i<a[x].size();i++)
step(a[x][i],v);
}
void calc(int x,int *v){
if(v[x]==1)return;v[x]=1;
for(int i=0;i<a[x].size();i++)
calc(a[x][i],v);
return;
}
void dfs(int x,int *v,int pos){
if(v[x]>0)return;
else if(v[x]<0){
if((-v[x])==pos)return;
else v[x]=1;
}
else if(!v[x])v[x]=-pos;
for(int i=0;i<a[x].size();i++)
if(v[x]==1)calc(a[x][i],v);
else dfs(a[x][i],v,pos);
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
a[x].push_back(y);X[i]=x;Y[i]=y;
}
for(int i=1;i<=n;i++)step(i,f[i]);
for(int x=1;x<=n;x++){
g[x][x]=1;
for(int i=0;i<a[x].size();i++)
dfs(a[x][i],g[x],i+1);
}
for(int i=1;i<=m;i++){
if(f[Y[i]][X[i]]){
if(g[X[i]][Y[i]]==1)puts("same");
else puts("diff");
}
else{
if(g[X[i]][Y[i]]==1)puts("diff");
else puts("same");
}
}
return 0;
}
AT3945-[ARC092D]Two Faced Edges【dfs】的更多相关文章
- AT3945 [ARC092D] Two Faced Edges
要求,翻转一条边,强连通分量个数是否会改变. 考虑连通分量个数会改变的因素: 即\(v\to u\)是否成立,以及翻转前,是否有一条\(u \to v\)的路径不经过该条边 以上当只有一个满足时,连通 ...
- 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】
目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...
- Kattis - glitchbot 【DFS】
Kattis - glitchbot [DFS] 题意 有一个机器人 刚开始在(0, 0),然后给出一个目标点,并且会给出一系列指令,但是其中会有一个指令是错误的.我们需要找出那个指令,并且改成正确的 ...
- HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛 - 初赛(A))
度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 【dfs】P1331 海战
题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防海军部仅有很少的几 ...
- 【dfs】p1731 生日蛋糕
1441:[例题2]生日蛋搞 [题目描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体.设从下往上数第i(1≤i≤M)层蛋糕是半径为Ri, 高 ...
- 【dfs】LETTERS
1212:LETTERS [题目描述] 给出一个roe×colroe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母.问最多可以经过几个字母. [ ...
- 洛谷P1605 迷宫【dfs】
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
- 【dfs】BZOJ1703-[Usaco2007 Mar]Ranking the Cows 奶牛排名
[题目大意] 农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序,约翰已经比较了M(1≤M≤10000)对奶牛的产奶率,但他 ...
随机推荐
- C# 异步锁 await async锁,lock,Monitor,SemaphoreSlim
异步方法内无法使用Monitor 和lock 所以只能用System.Threading.SemaphoreSlim了 //Semaphore (int initialCount, int maxim ...
- 菜鸟的springboot常用注解总结
菜鸟的springboot常用注解总结 0.前言 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用 ...
- 关于Ubuntu18.04 linux系统使用搜狗输入法 出现乱码
解决: 执行下面的命令即可!无需重启系统 killall fcitx
- web.xml中自定义Listener
Listener可以监听容器中某一执行动作,并根据其要求做出相应的响应. 常用的Web事件的监听接口如下: ServletContextListener:用于监听Web的启动及关闭 ServletCo ...
- JDBC中级篇(MYSQL)——在JDBC中如何获得表中的,自增长的字段值
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package c_increment; import java.sql.Connection; import java.sql.P ...
- opencv入门系列教学(七)改变颜色空间、提取彩色对象
0.序言 之前的博客里我们介绍了opencv在图像上的基本操作,下面我们来进行稍微深入一点的介绍,从这里开始我们可以发现opencv库能给我们带来的更多更有趣的功能.从现在开始,我们将逐步深入了解 ...
- 老司机带你体验SYS库多种新玩法
导读 如何更加愉快地利用sys库做一些监控? 快来,跟上老司机,体验sys库的多种新玩法~ MySQL5.7的新特性中,非常突出的特性之一就是sys库,不仅可以通过sys库完成MySQL信息的收集,还 ...
- MySQL 常用的聚合函数
[常用的聚合函数] mysql聚合函数一般用户统计一列值进行计算,然后返回计算结果.一般于分组group by 配合使用. count //统计个数 select count(*) from test ...
- 大厂的 SDK 写法,偷学到了!
自己动手写 SDK 的经验技巧分享 大家好,我是鱼皮. 最近因为工作需要,自己动手写了一些项目的通用 SDK.在编写的过程中,我阅读和参考了不少公司中其他大佬写的 SDK,也总结了一些开发 SDK 的 ...
- Robot Framework(8)- Collections 测试库常用的关键字列表
如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html 前言 所有关键字 ...