HDU
来源:互联网 发布:友声电子秤软件 编辑:程序博客网 时间:2024/06/05 07:50
小希的迷宫
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 51951 Accepted Submission(s): 16206
整个文件以两个-1结尾。
6 8 5 3 5 2 6 45 6 0 08 1 7 3 6 2 8 9 7 57 4 7 8 7 6 0 03 8 6 8 6 45 3 5 6 5 2 0 0-1 -1
YesYesNo题意:保证任意两点连通(是否连通容易想到并查集),且只有一条路能够到达目标点(即没有环的出现)
易错点:忽略首次输入0,0时,应该输出Yes,另外就是输入数据时注意案例结束的条件,最后就是连通分支数大于1肯定是No,(因为有了孤立
边).总之,易错点按照从特殊—>一般的思想去考虑,或许会减少许多不必要的错误。
解题思路:对输入的边进行merge(u,v)合并,就是把其归结到一个节点上,同时对u,v标记,最后在扫描时要加上book【i】==1的条件,
仅仅是为了保证此点出现过,不然的话出现了孤立点,也会输出Yes。
代码如下:
#include<stdio.h>#include<string.h>#define N 100006int f[N],flag=1,book[N];int getf(int v){ if(f[v]==v) return v; else//如果f[v]!=v,代表f[v]已经认过父亲了,我们用递归实现找到他的最终的根节点即他的祖先,这个过程可以用纸画出来,方便理解 { f[v]=getf(f[v]); return f[v]; }}void merge(int x,int y){ int fx=getf(x); int fy=getf(y); if(fx!=fy)//不连通的话,尊左原则,找父亲节点 f[fx]=fy; else flag=0;//已经连通的话标记为0,就是有环出现了}int main(){ int a,b; while(~scanf("%d %d",&a,&b)) { if(a==-1&&b==-1) break;//输入案例结束条件 if(a==0&&b==0)//特殊情况,预处理下 { printf("Yes\n"); continue; } memset(book,0,sizeof(book)); for(int i=1; i<100005; i++) f[i]=i; book[a]=book[b]=1; merge(a,b); flag=1;//标记变量初始位 1 while(~scanf("%d %d",&a,&b)) { if(a==0&&b==0) break; merge(a,b);//压缩路径 book[a]=book[b]=1;//出现过得点标记为1 } int s=0; for(int i=1; i<100005; i++) { if(f[i]==i&&book[i]) s++;//s为1,即连通分支数为1,祖先根节点就一个 if(s>1) flag=0;//有孤立边,即有不同的祖先根节点 } if(flag) printf("Yes\n"); else printf("No\n"); } return 0;}
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- IsDlgButtonChecked()
- 神经网络与深度学习 笔记1 感知机 S型神经元
- 深入浅出Tensorflow(四):卷积神经网络
- ORACLE小记
- Mac的xampp mysql 无法启动和安装时候的坑
- HDU
- HDMI接收芯片 IT6801fn 输入调试
- 页面可用性之浏览器默认字体与CSS中文字体
- 一台电脑同时运行多个tomcat配置方法
- hibernate-日常小计 原生sql 返回map
- 【SQL】连接(二):左连接
- 遇到request.getParameter()获取空值
- 每日订单号从0001开始
- java泛型