Freda的迷宫
Freda的迷宫
Freda是一个迷宫爱好者,她利用业余时间建造了许多迷宫。每个迷宫都是由若干房间和走廊构成的,每条走廊都连接着两个不同的房间,两个房间之间最多只有一条走廊直接相连,走廊都是双向通过。
黄昏时候,Freda喜欢在迷宫当中漫步。每天,Resodo都会为Freda设计一个挑战方案。Resodo会指定起点和终点,请Freda来找到一条从起点到终点的简单路径。一条简单路径定义为一个房间序列,每个房间至多在序列里出现一次,且序列中相邻的两个房间有走廊相连。当起点和终点之间存在且仅存在一条简单路径的时候,Freda认为这个挑战方案是RD的。现在,请你帮帮Resodo来写一个程序,判断一个挑战方案是否是RD的。Input
第一行三个整数N,M,Q.分别表示房间数,走廊数,询问数。
接下来M行每行2个整数x,y, 0<x,y<=N, 表示x和y之间有一条走廊相连。
接下来Q行每行2个整数x,y, 表示询问以x为起点,y为终点的挑战方案是否是RD的.Output
对于每个询问,输出一行”Y”或者”N”(不含引号).Y表示该询问所表示的挑战方案是RD的,N表示该询问所表示的挑战方案不是RD的.
Sample Input
6 5 3
1 2
2 3
2 4
2 5
4 5
1 3
1 5
2 6Sample Output
Y
N
N
思路:
简单tarjan
\(\mathfrak{Talk\ is\ cheap,show\ you\ the\ code.}\)
#include<map>
#include<cstdio>
#include<queue>
#include<bitset>
#include<vector>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
# define Type template<typename T>
# define read read1<int>()
Type inline T read1()
{
T t=0;
char k;
bool fl=0;
do k=getchar(),(k=='-')&&(fl=1);while('0'>k||k>'9');
while('0'<=k&&k<='9')t=(t<<3)+(t<<1)+(k^'0'),k=getchar();
return fl?-t:t;
}
struct re{Type re operator >> (T &a){a=read1<T>();return *this;}}re;
# define fre(k) freopen(k".in","r",stdin);freopen(k".ans","w",stdout)
vector<int>G[10001];
int s,m,q,t,dfn[10001],low[10001],f[10001];
int Find(int n){if(f[n]==n)return n;return f[n]=Find(f[n]);}
void Merge(int u,int v){f[Find(u)]=Find(v);}
void dfs(int n,int fa){
dfn[n]=low[n]=++t;
for(int i=0;i<G[n].size();++i)
if(G[n][i]!=fa)
if(!dfn[G[n][i]]){
dfs(G[n][i],n);
low[n]=min(low[n],low[G[n][i]]);
if(dfn[n]<low[G[n][i]])Merge(G[n][i],n);
}
else low[n]=min(low[n],dfn[G[n][i]]);
}
int main(){
s=read,m=read,q=read;
for(int i=0;i<m;++i){
int u=read,v=read;
G[u].push_back(v);
G[v].push_back(u);
}
for(int i=1;i<=s;++i)f[i]=i;
for(int i=1;i<=s;++i)
if(!dfn[i])dfs(i,0);
for(int i=1;i<=q;++i)
puts(Find(read)==Find(read)?"Y":"N");
return 0;
}
因果乃旋转纺车,光彩之多面明镜
浮世苍茫,不过瞬逝幻梦
善恶爱诳,皆有定数
于命运之轮中
吞噬于黄泉之冥暗
呜呼,吾乃梦之戍人
幻恋之观者
唯于万华镜中,永世长存
浮世苍茫,不过瞬逝幻梦
善恶爱诳,皆有定数
于命运之轮中
吞噬于黄泉之冥暗
呜呼,吾乃梦之戍人
幻恋之观者
唯于万华镜中,永世长存

浙公网安备 33010602011771号