hdu 1272 小希的迷宫
来源:互联网 发布:白银公司大数据公司 编辑:程序博客网 时间:2024/06/18 08:36
主题思想: 判断连通分量,有没有环,是不是最小生成树。
判断连通分量可以用并查集来做,如果新来一条边,这条边的两个端点的根是同一个,那么加上这条边后,和根就会构成一个环,如果要输出环,可以采用dfs+ stack的方式把构成环的节点压入栈。 如果没有环,只有一个连通分量,边的个数+1 等于顶点的个数,那么就是最小生成树。
针对这道题,还要注意处理输入数据可能是0 0 并以0 0 表示这组数据的结束,0 0 表示空树,要输出yes
AC代码:
#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;const int maxn=100005;int a[maxn];bool hascycle=false;int visited[maxn];int en; //edge num;int vn;int Find(int x){ if(a[x]==x) return a[x]; else a[x]=Find(a[x]); return a[x];}void UN(int p,int q){ p=Find(p); q=Find(q); if(p==q){ hascycle=true; }else{ a[p]=q; en++; } return ;}void init(){ en=0; vn=0; for(int i=0;i<maxn;i++){ a[i]=i; visited[i]=false; hascycle=false; }}int main(){ int c,d; init(); bool flag=false; while(true){ init(); scanf("%d%d",&c,&d); if(c==-1&&d==-1) break; if(c==0&&d==0){ printf("Yes\n"); continue; } visited[c]=true; visited[d]=true; UN(c,d); while(true){ scanf("%d%d",&c,&d); if(c==0&&d==0) break; visited[c]=true; visited[d]=true; UN(c,d); } for(int i=0;i<maxn;i++){ if(visited[i]) vn++; } if(!hascycle&&en+1==vn)printf("Yes\n"); else printf("No\n"); } return 0;}
阅读全文
0 0
- 小希的迷宫 hdu 1272
- HDU 1272 小希的迷宫
- hdu 1272 小希的迷宫
- hdu 1272 小希的迷宫
- hdu 1272 小希的迷宫
- HDU-1272-小希的迷宫
- HDU 1272 小希的迷宫
- [tree]hdu 1272 小希的迷宫
- HDU 1272 小希的迷宫
- Hdu 1272 小希的迷宫
- HDU-1272:小希的迷宫
- HDU 1272 小希的迷宫
- hdu 1272 小希的迷宫
- hdu 1272 小希的迷宫
- HDU 1272 小希的迷宫
- HDU 1272 小希的迷宫
- hdu 1272 小希的迷宫
- hdu 1272 小希的迷宫
- 关于值传递和引用传递
- 字符串置换
- 静态代码块、构造代码块和构造函数执行顺序
- VS 项目文件 .vcxproj 文件 工程自定义宏, .vcxproj 文件组织结构
- 一个内向者的自我修炼
- hdu 1272 小希的迷宫
- Hibernate3学习笔记(一)
- Ubuntu 16.04 下快速搭建 LNMP环境
- login和downloadImage网络编程范例
- fpga LSTM
- c# controls.add 控件的使用 ,间接引用还是值引用
- 配置linux集群中的NFS文件共享服务 centos6.5Final
- 脚本
- redis cluster管理工具redis-trib.rb详解[转]