小鑫的城堡
2014-02-20 13:10
267 查看
小鑫的城堡
这个题要满足两个条件:
1.任两个房间是相通的
2.两个房间之间不可以有第二条路
思路:只需满足点数的个数=通道个数+1,即可以保证第二个条件,如果得到的头节点的个数=1,就可以说明第一个条件。
Time Limit: 1000MS Memory limit: 65536K
题目描述
从前有一个国王,他叫小鑫。有一天,他想建一座城堡,于是,设计师给他设计了好多简易图纸,主要是房间的连通的图纸。小鑫希望任意两个房间有且仅有一条路径可以相通。小鑫现在把设计图给你,让你帮忙判断设计图是否符合他的想法。比如下面的例子,第一个是符合条件的,但是,第二个不符合,因为从5到4有两条路径(5-3-4和5-6-4)。输入
多组输入,每组第一行包含一个整数m(m < 100000),接下来m行,每行两个整数,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。输出
每组数据输出一行,如果该城堡符合小鑫的想法,那么输出"Yes",否则输出"No"。示例输入
5 2 5 2 3 1 3 3 6 4 6 6 1 2 1 3 3 4 3 5 5 6 6 4
示例输出
YesNo这个题要满足两个条件:
1.任两个房间是相通的
2.两个房间之间不可以有第二条路
思路:只需满足点数的个数=通道个数+1,即可以保证第二个条件,如果得到的头节点的个数=1,就可以说明第一个条件。
#include<stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> int bin[110000]; int u[110000],w[1100000]; int num[110000]; int findx(int x) { int r=x; while(bin[r]!=r) r=bin[r]; return r; } void merge(int x,int y) { int fx,fy; fx=findx(x); fy=findx(y); if(fx!=fy) bin[fx]=fy; } int main() { int n,m,i,j; while(~scanf("%d",&m)) { memset(num,0,sizeof(num)); int max=0; for(i=0; i<m; i++) { scanf("%d%d",&u[i],&w[i]); int e=u[i]>w[i]?u[i]:w[i]; if(e>max) { max=e; } num[u[i]]++; num[w[i]]++; } int po=0; for(i=1; i<=max; i++) { bin[i]=i; if(num[i]) po++; } for(i=0; i<m; i++) { merge(u[i],w[i]); } int count=0; for(i=1; i<=max; i++) { if(bin[i]==i&&num[i]) count++; } if(count==1&&po==m+1) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- Oracle表空间使用情况查询
- Oracle表空间使用情况查询
- Rotate List
- eclipse window 选项下没有Android SDK and AVD Manager项
- jquery Radio操作
- OJ_1073
- sql server网页项目发布到生产环境和开发环境不一致的情况
- Balanced Lineup(线段树)
- easyui跨iframe访问
- 文件选择控件
- 调用文字在位编辑器
- 防呆设计(内容摘录)
- 详解MyEclipse10 安装Spket 1.6.23(支持Extjs4.1.1及jQuery1.8)
- OJ_1072
- 不让键盘挡住UITextField
- ExtJs Ext.form.field.TextArea+Ckeditor 扩展富文本编辑器
- linux创建文件系统
- python学习笔记(django入门01)
- flex通过iframe嵌入html,在iframe边上的空白处点击后,iframe被隐藏
- 改变UITextField placeHolder颜色、字体