hdoj 1325 Is It A Tree? 【并查集】
2024-10-08 01:04:51
版权声明:本文为博主原创文章。未经博主同意不得转载。
https://blog.csdn.net/shengweisong/article/details/34099151
做了一上午,最终ac了 wa了一次主要是忘了还有环!。!
主要是运用并查集知识。又复习了一次!!
思路:输入之后找能不能成环,成环就不是,其次还要推断是不是有两个父节点,假设有两个父节点也不是。之后就找相关的祖先就好了。
还要注意:假设仅仅有一个节点,也是树。假设有两个或多个根节点也不是树;假设没有根节点也不是
链接 pid=1325" rel="nofollow">http://acm.hdu.edu.cn/showproblem.php?pid=1325
代码
#include<stdio.h>
int fat[1000];
int father( int n ) //寻找祖先
{
if( fat[n] != n ) fat[n] = father(fat[n]);
return fat[n];
}
int main()
{
int i, j, n, m, a[1000], b[1000], v = 1;
while( 1 ){
for( i = 0; i < 1000; i ++ )
fat[i] = i;
int flag = 0;
scanf( "%d%d", &a[0], &b[0] );
if( a[0]< 0&&b[0]< 0 ) break;
fat[b[0]] = a[0];//由题意可知fat[b[i]] = a[i];
i = 1;
while( scanf("%d%d", &a[i], &b[i]), a[i]||b[i] ){
if( flag == 0 ){ //假设flag=1那就表明成环了,或者有两个父节点
if( fat[a[i]] == b[i] ){
flag = 1; //推断是不是成环
continue;
}
if( fat[b[i]] != b[i] ) {
flag = 1;//推断是不是有两个父节点
continue;
}
if( fat[a[i]]!= a[i] )
fat[a[i]] = father(a[i]);
fat[b[i]] = a[i];
}
else{
fat[b[i]] = a[i];
}
i++;
}
// for( j = 0; j < i; ++ j ) //以下四行没有必要,假设没有根节点。就是环(多亏了某仙鹤同学)
// if( fat[a[j]] == a[j] ) break;;
// if( i == j )
// flag = 1;
if( flag ){
printf( "Case %d is not a tree.\n", v++ );
continue;
}
else{
if( i == 1 ){ //假设仅仅有一组
printf( "Case %d is a tree.\n", v++ );
continue;
}
for( j = 1; j < i; ++ j ) //推断是不是有多个根节点
if( fat[a[j]] != fat[a[0]] ){
printf( "Case %d is not a tree.\n", v++ );
break;
}
if( j == i )
printf( "Case %d is a tree.\n", v++ );
}
}
return 0;
}
最新文章
- Dynamics CRM 2013 installation
- java 使用 poi 解析excel
- C# 用代码创建 DataSet 和 DataTable 的列和记录
- 一模 (3) day2
- Jquery 控件
- Windows I/O模型之一:Select模型
- hdu_5890_Eighty seven(bitset优化DP)
- webpack-hot-middleware 用于 livereload
- ACM心路
- HDU5908 Abelian Period 暴力
- 初步了解php,实现注册及登录
- oracle 树形表结构查询 排序
- JS之正则表达式
- 判断(if)语句
- 每天一个linux命令(8):scp使用
- oracle 11g rac asm磁盘组增加硬盘
- BFS模板
- 动态添加XtraTabControl的page页和子窗体
- java.rmi.server.ExportException: Port already in use: 1099; nested exception is
- Oracle create tablespace 创建表空间语法详解