【POJ】1308 Is It A Tree?((并查集 + set)or (map))
http://poj.org/problem?id=1308
这个题数组开到200就可以了,但题目中貌似没有说呢?
读入每一对顶点,看看他们是否在同一个集合中,如果是的话,肯定成环,不是一棵树。
用set容器保存节点,最后遍历每个节点,看他们是不是属于同一个集合,如果不是,那么就形成了森林,肯定不是树。
但是 1 2 3 2 0 0 这组数据形成的不是树,但是并查集判断出来是树,emmm,结果是AC的,有点emmm。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set> using namespace std;const int maxn = 200;int pre[maxn];
int ran[maxn];
int flag;void init()
{for(int i=0;i<maxn;i++){pre[i] = i;}memset(ran,0,sizeof(ran));
}int find(int x)
{if(x==pre[x])return x;return pre[x] = find(pre[x]);
}void join(int x,int y)
{if(x==y){flag = 0;return ;}int a = find(x);int b = find(y);if(a==b){flag = 0;return ;}if(ran[a]>ran[b]){pre[b] = a;}else{if(ran[a]==ran[b]){ran[b]++;}pre[a] = b;}
}int main ()
{int x,y,k=1;while(scanf("%d%d",&x,&y)!=EOF){if(x==-1 && y==-1)break;if(x==0 && y==0){printf("Case %d is a tree.\n",k++);continue;} flag = 1;init();set<int> s;s.insert(x);s.insert(y);join(x,y);while(scanf("%d%d",&x,&y)!=EOF){if(x==0 && y==0)break;s.insert(x);s.insert(y);join(x,y);}if(flag==0){printf("Case %d is not a tree.\n",k++);}else{set<int>::iterator it;it = s.begin();int root = find(*it);it++;for(;it!=s.end();it++){if(find(*it)!=root){flag = 0;break;}}if(flag){printf("Case %d is a tree.\n",k++);}else{printf("Case %d is not a tree.\n",k++);}}}return 0;
}
用map来写的话
判断一个图是否是一棵树,没有孤立的自环点,考虑每个点的入度,作为一棵树,只有根节点的入度是0,其余节点的入度都必须是1,这要不满足以上条件就不是树了。
考虑到题目中没有说输入的一组结点是不是能是相同的,如果是相同的,就可能出现自环,这样也判断不出来,所以要考虑输入的两个数是否相同。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>using namespace std;const int maxn = 200;
map<int,int> m;int main ()
{int x,y,k=1,flag;while(scanf("%d%d",&x,&y)!=EOF){m.clear();flag = 1;if(x==-1 && y==-1)break;if(x==0 && y==0){printf("Case %d is a tree.\n",k++);continue;}if(x==y){flag = 0;}else{m[x] = 0;m[y] = 1; }while(scanf("%d%d",&x,&y)!=EOF){if(x==0 && y==0)break;if(x==y){flag = 0;continue;} if(m.find(x)==m.end())m[x] = 0;m[y]++;if(m[y]>1){flag = 0;continue;}}if(flag==0){printf("Case %d is not a tree.\n",k++);}else{int sum=0;map<int,int>::iterator it;for(it=m.begin();it!=m.end();it++){if(it->second==0)sum++;if(sum>1){flag = 0;break;}}if(sum==0){flag=0;}if(flag==0){printf("Case %d is not a tree.\n",k++);}else{printf("Case %d is a tree.\n",k++);}}}return 0;
}
【POJ】1308 Is It A Tree?((并查集 + set)or (map))相关推荐
- HDU 1325POJ 1308 Is it A tree ? [并查集+树判定]
题目链接 poj hdu Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...
- POJ 1703 Find them, Catch them(并查集高级应用)
POJ 1703 Find them, Catch them(并查集高级应用) 手动博客搬家:本文发表于20170805 21:25:49, 原地址https://blog.csdn.net/sunc ...
- POJ 1417 True Liars(路径压缩并查集+DP背包问题)
POJ 1417 True Liars(路径压缩并查集+DP背包问题) http://poj.org/problem?id=1417 题意: 给出p1+p2个人,其中p1个是好人,p2个是坏人.然后有 ...
- poj 1308 Is It A Tree?
// 题意: 给出一些边,由所给出的边能否构成一棵树.(节点数<100) // 思路: n个顶点的树具有3个特点:连通,不含环,恰好包含n-1条边.只要有任意两个,就能推导出第3个// 所以我们 ...
- HDU 5606 tree 并查集
tree 把每条边权是1的边断开,发现每个点离他最近的点个数就是他所在的连通块大小. 开一个并查集,每次读到边权是0的边就合并.最后Ansi=size[findset(i)],size表示每个并 ...
- HDU 1325 Is It A Tree? 并查集
点击打开链接 Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- POJ - 2513 Colored Sticks(字典树+并查集+欧拉回路)
题目链接:点击查看 题目大意:给出n个木棍,问若两两相连,最终能否构成一根长直木棍,相连的规则是两个木棍的相接端点的颜色需要保持相同 题目分析:关于这个题目,我们可以将每个木棍视为一条边,每个木棍的两 ...
- POJ 3694 (tarjan缩点+LCA+并查集)
好久没写过这么长的代码了,题解东哥讲了那么多,并查集优化还是很厉害的,赶快做做前几天碰到的相似的题. 1 #include <iostream> 2 #include <algori ...
- POJ 3694 Network ★(边双连通分量+并查集缩点+LCA)
[题意]一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(每次回答是在上一次连边的基础之上) [分析]好题,做完后涨了很多姿势~ 普通做法当然就是每加 ...
- Rochambeau POJ - 2912 (枚举和加权并查集+路径压缩)找唯一裁判
题意:有n个人玩石头剪刀布,有且只有一个裁判.除了裁判每个人的出拳形式都是一样的. a<b表示b打败a,a=b表示a和b出拳一样,平手.a>b表示a打败b. 给出m个回合的游戏结果,问能否 ...
最新文章
- Sublime text 简单配置
- 用.netcore写一个简单redis驱动,调试windows版本的redis
- IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm
- js文件处理File
- Python学习7 集合Set
- redis 关系数据库怎么转换 和_redis数据库设计(转)
- 轻量应用服务器支持带宽套餐升级至流量包套餐流程说明
- C++简易复数类的实现
- linux补丁服务,Linux补丁程序管理_补丁工具 _ ManageEngine Desktop Central
- 文件流操作,报“because it is being used by another process. ”错误解决
- 云课堂智慧职教网页版登录入口_云课堂智慧职教网页版
- 配置微信公众号之公众号绑定小程序
- VMware Workstation启动虚拟机时蓝屏
- 中国银联移动支付技术规范
- FlashFXP,flashfxp连接失败
- 关于机器学习中鲁棒性和泛化能力
- 小度总显示服务器连接失败,小度本地端口分配失败是什么意思
- 用几段代码搞定Java文件流
- SQL之LEFT JOIN,EIGHT JOIN,INSERT JOIN的区别
- ESP8266+micropython+HCSR04 超声波测距传感器