题目链接: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 ;
}

 

最新文章

  1. java 深入技术八(内省)
  2. 【USACO 2.3】Controlling Companies (递推)
  3. 谨慎DateTime.Now在EF的query中的使用
  4. jQuery.ajax()的相关参数及使用
  5. [转]java去除List中重复的元素
  6. hibernate学习(5)——对象状态与一级缓存
  7. 1069 Nim游戏
  8. Maven(1)-安装和配置
  9. 绑定本地Service并与之通信
  10. 在ubuntu下利用minicom实现串口通信
  11. 在Google map图上做标记,并把标记相连接
  12. tab奇偶行颜色交替+插件
  13. java获取mp3的时长和播放mp3文件
  14. 官网jquery压缩版引用地址:
  15. 在Bootstrap开发框架中使用dataTable直接录入表格行数据
  16. 不能最为IF判断条件的属性
  17. 机器学习算法 Python&amp;R 速查表
  18. Tomcat服务器使用和debug
  19. 20165321实验一Java开发环境的熟悉-1
  20. InstallShield2015制作安装包----------卸载前结束执行中的进程

热门文章

  1. 【php】session读写锁
  2. action动作类的生命周期
  3. 迁移数据到历史表SQL(转)
  4. 3.7 TCP拥塞控制
  5. POJ1201 Intervals 【差分约束】
  6. BZOJ 1367 [Baltic2004]sequence 解题报告
  7. 【Python3的进制扫盲】
  8. python学习笔记(四) 思考和准备
  9. 抓包 ------ Wireshark 的使用
  10. Python使用redis介绍