P2978 [USACO10JAN] Tea Time S
题目描述
N(1≤N≤1000)N (1 \leq N \leq 1000)N(1≤N≤1000) 头奶牛,编号为 1…N1 \dots N1…N,在参加一个喝茶时间活动。在喝茶时间活动开始之前,已经有 M(1≤M≤2,000)M (1 \leq M \leq 2,000)M(1≤M≤2,000) 对奶牛彼此认识(是朋友)。第i对彼此认识的奶牛通过两个不相同的整数 AiA_iAi 和 BiB_iBi 给定(1≤Ai≤N,1≤Bi≤N1 \leq A_i \leq N, 1 \leq B_i \leq N1≤Ai≤N,1≤Bi≤N)。输入数据保证一对奶牛不会出现多次。 在喝茶时间活动中,如果奶牛 iii 和奶牛 jjj 有一个相同的朋友奶牛 kkk,那么他们会在某次的喝茶活动中去认识对方(成为朋友),从而扩大他们的社交圈。请判断,在喝茶活动举办很久以后(直到没有新的奶牛彼此认识),Q(1≤Q≤100)Q (1 \leq Q \leq 100)Q(1≤Q≤100) 对奶牛是否已经彼此认识。询问j包含一对不同的奶牛编号 XjX_jXj 和 YjY_jYj(1≤Xj≤N,1≤Yj≤N1 \leq X_j \leq N, 1 \leq Y_j \leq N1≤Xj≤N,1≤Yj≤N)。
例如,假设共有 555 头奶牛,我们知道 222 号认识 555 号,222 号认识 333 号,而且 444 号认识 555 号;如下图 (a)。
2---3 2---3 2---3
\ |\ | |\ /|
1 \ --> 1 | \ | --> 1 | X |
\ | \| |/ \|
4---5 4---5 4---5
(a) (b) (c)
在第一次喝茶活动中,222 号认识 444 号,333 号认识 555 号,如上图 (b) 所示。接下来的喝茶活动中,333 号认识了 444 号,如上图 © 所示。
输入格式
第 111 行:三个空格隔开的整数:NNN,MMM 和 QQQ。
第 2…M+12 \dots M+12…M+1 行:第 i+1i+1i+1 行包含两个空格隔开的整数 AiA_iAi 和 BiB_iBi。
第 M+2…M+Q+1M+2 \dots M+Q+1M+2…M+Q+1 行:第 j+M+1j+M+1j+M+1 行包含两个空格隔开的整数 XjX_jXj 和 YjY_jYj,表示询问 jjj。
输出格式
第 1…Q1 \dots Q1…Q 行:如果第 jjj 个询问的两头奶牛认识, 第 jjj 行输出 Y。如果不认识,第 jjj 行输出 N。
输入输出样例 #1
输入 #1
5 3 3
2 5
2 3
4 5
2 3
3 5
1 5
输出 #1
Y
Y
N
说明/提示
感谢@蒟蒻orz神犇 提供翻译。
思路
看似很神秘,实则有点诈骗的成分。
其实就是并查集板子。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,q,prt[1001];
int getfather(int u)
{
if(prt[u]==u)
return u;
return prt[u]=getfather(prt[u]);
}
void merge(int x,int y)
{
int xx=getfather(x),yy=getfather(y);
if(xx!=yy)
prt[xx]=yy;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
prt[i]=i;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
merge(x,y);
}
for(int i=1;i<=q;i++)
{
int x,y;
cin>>x>>y;
int xx=getfather(x),yy=getfather(y);
if(xx!=yy)
cout<<"N\n";
else
cout<<"Y\n";
}
return 0;
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)