E - Is It A Tree? 并查集判断是否为树
2024-08-26 23:47:26
题目链接:https://vjudge.net/contest/271361#problem/E
具体思路:运用并查集,每一次连接上一个点,更新他的父亲节点,如果父亲节点相同,则构不成树,因为入读是2,然后再去遍历每一个点的父亲节点,判断一下祖宗节点有几个,只有1个才能构成树,注意0 0也是树.。。
AC代码:
#include<iostream>
#include<stack>
#include<queue>
#include<iomanip>
#include<stdio.h>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
# define inf 0x3f3f3f3f
# define maxn
int father[maxn];
int vis[maxn];
int k;
map<int,int>q;
int Find(int t)
{
return t==father[t]?t:father[t]=Find(father[t]);
}
void match(int t1,int t2)
{
int x=Find(t1);
int y=Find(t2);
if(x!=y)
{
father[y]=x;
return ;
}
else
k=;
}
int main()
{
int x,y;
int num=;
while(~scanf("%d %d",&x,&y))
{
q.clear();
k=;
if(x==-&&y==-)break;
memset(vis,,sizeof(vis));
if(x==&&y==)
{
printf("Case %d is a tree.\n",++num);
continue;
}
for(int i=; i<=maxn; i++)
{
father[i]=i;
}
vis[x]=;
vis[y]=;
match(x,y);
while(~scanf("%d%d",&x,&y))
{
if(x==&&y==)break;
match(x,y);
vis[x]=;
vis[y]=;
}
if(k==)printf("Case %d is not a tree.\n",++num);
else
{
int flag=;
for(int i=; i<=maxn; i++)
{
if(vis[i])
{
int temp=Find(i);
q[temp]=;
}
}
if(q.size()==) printf("Case %d is a tree.\n",++num);
else printf("Case %d is not a tree.\n",++num);
}
}
return ;
}
最新文章
- java 深入技术八(内省)
- 【USACO 2.3】Controlling Companies (递推)
- 谨慎DateTime.Now在EF的query中的使用
- jQuery.ajax()的相关参数及使用
- [转]java去除List中重复的元素
- hibernate学习(5)——对象状态与一级缓存
- 1069 Nim游戏
- Maven(1)-安装和配置
- 绑定本地Service并与之通信
- 在ubuntu下利用minicom实现串口通信
- 在Google map图上做标记,并把标记相连接
- tab奇偶行颜色交替+插件
- java获取mp3的时长和播放mp3文件
- 官网jquery压缩版引用地址:
- 在Bootstrap开发框架中使用dataTable直接录入表格行数据
- 不能最为IF判断条件的属性
- 机器学习算法 Python&;R 速查表
- Tomcat服务器使用和debug
- 20165321实验一Java开发环境的熟悉-1
- InstallShield2015制作安装包----------卸载前结束执行中的进程