Problem Description:

A国有n座城市,编号为1~n,这n个城市之间没有任何交通线路,所以不同城市的居民之间不能互通,所以A国的人打算为这n个城市建立k条交通线(两座城市之间可以有两条及以上的线路),交通线只能贯穿两座城市p, q(存在p=q的情况,不用考虑但会占用一条交通线), 建立交通线后两座城市的居民可以互通。 例如:建立1, 4后再建立4, 2,则1和2是互通的(1—>4—>2)。建立完k条交通线后,接着有m次询问,问居住在两个城市a, b的居民能否互通。

Input:

输入数据有多组,每一组的第一行包含两个整数n (0<n<=5000), k (0<k<=10000) , 接下来有k行,每行包含两个整数p,q (0<p,q<=n),代表城市p,q之间建立一条交通线。再接着一个整数m (0<m<=n) 代表有m次询问,接下来有m行,每行包含两个整数a, b(0<a,b<=n) 询问城市a,b之间的居民能否互通 (同一个城市的居民能互通)。

Output:

两座城市的居民可以互通则输出“YES”,否则输出“NO”,每个输出占一行。

Sample Input:

6 5
1 4
4 2
2 4
5 6
4 1
4
1 2
1 3
1 6
4 4

Sample Output:

YES
NO
NO
YES
解题思路:简单的并查集,水过。
AC代码:
 #include<bits/stdc++.h>
using namespace std;
const int maxn=;
int n,k,p,q,m,a,b,fa[maxn];
int findt(int x){
int pir=x,tmp;
while(pir!=fa[pir])pir=fa[pir];
while(x!=pir){tmp=fa[x];fa[x]=pir;x=tmp;}//路径压缩
return x;
}
void unite(int x,int y){
x=findt(x);y=findt(y);
if(x!=y)fa[x]=y;
}
int main(){
while(~scanf("%d%d",&n,&k)){
for(int i=;i<=n;++i)fa[i]=i;
while(k--){scanf("%d%d",&p,&q);unite(p,q);}
scanf("%d",&m);
while(m--){
scanf("%d%d",&a,&b);
if(findt(a)==findt(b))puts("YES");
else puts("NO");
}
}
return ;
}

最新文章

  1. HDU2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活[多重背包]
  2. 初学git:用git bash往github push代码
  3. MongoDB: 数据库复制
  4. smb
  5. IDisposable接口
  6. mysql 按年度、季度、月度、周、日SQL统计查询
  7. VHD容量调整的方法(保存原有vhd)
  8. Amazon Alexa登录授权(Android)
  9. 介绍一个轻量级iOS安全框架:SSKeyChain
  10. Android项目开发填坑记-Fragment的onAttach
  11. Python input保证输入为int类型
  12. [wordpress]更新插件时,免去FTP操作
  13. sql 多行转多列,多行转一列合并数据,列转行
  14. ElasticSearch搜索介绍四
  15. GitHub使用教程、注册与安装
  16. #ifdef、#ifndef、#else、#endif执行条件编译
  17. CentOS Java C JNI
  18. Atitit 软件项目系统托盘图标解决方案
  19. vue-Treeselect 使用备注
  20. 页面中图片以背景图形式展示好还是以img标签形式展示

热门文章

  1. 记录--git命令行上传项目到github仓库
  2. function&amp;箭头函数
  3. Vue 安装教程
  4. vim学习3-查找替换
  5. mode-c++
  6. [bzoj2783][JLOI2012]树_树的遍历
  7. [bzoj2213][Poi2011]Difference_动态规划
  8. backup script
  9. CF #323 DIV2 D题
  10. php生成随机password的几种方法