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))相关推荐

  1. 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/ ...

  2. POJ 1703 Find them, Catch them(并查集高级应用)

    POJ 1703 Find them, Catch them(并查集高级应用) 手动博客搬家:本文发表于20170805 21:25:49, 原地址https://blog.csdn.net/sunc ...

  3. POJ 1417 True Liars(路径压缩并查集+DP背包问题)

    POJ 1417 True Liars(路径压缩并查集+DP背包问题) http://poj.org/problem?id=1417 题意: 给出p1+p2个人,其中p1个是好人,p2个是坏人.然后有 ...

  4. poj 1308 Is It A Tree?

    // 题意: 给出一些边,由所给出的边能否构成一棵树.(节点数<100) // 思路: n个顶点的树具有3个特点:连通,不含环,恰好包含n-1条边.只要有任意两个,就能推导出第3个// 所以我们 ...

  5. HDU 5606 tree 并查集

    tree 把每条边权是1的边断开,发现每个点离他最近的点个数就是他所在的连通块大小. 开一个并查集,每次读到边权是0的边就合并.最后Ans​i​​=size[findset(i)],size表示每个并 ...

  6. HDU 1325 Is It A Tree? 并查集

    点击打开链接 Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  7. POJ - 2513 Colored Sticks(字典树+并查集+欧拉回路)

    题目链接:点击查看 题目大意:给出n个木棍,问若两两相连,最终能否构成一根长直木棍,相连的规则是两个木棍的相接端点的颜色需要保持相同 题目分析:关于这个题目,我们可以将每个木棍视为一条边,每个木棍的两 ...

  8. POJ 3694 (tarjan缩点+LCA+并查集)

    好久没写过这么长的代码了,题解东哥讲了那么多,并查集优化还是很厉害的,赶快做做前几天碰到的相似的题. 1 #include <iostream> 2 #include <algori ...

  9. POJ 3694 Network ★(边双连通分量+并查集缩点+LCA)

    [题意]一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(每次回答是在上一次连边的基础之上) [分析]好题,做完后涨了很多姿势~ 普通做法当然就是每加 ...

  10. Rochambeau POJ - 2912 (枚举和加权并查集+路径压缩)找唯一裁判

    题意:有n个人玩石头剪刀布,有且只有一个裁判.除了裁判每个人的出拳形式都是一样的. a<b表示b打败a,a=b表示a和b出拳一样,平手.a>b表示a打败b. 给出m个回合的游戏结果,问能否 ...

最新文章

  1. Sublime text 简单配置
  2. 用.netcore写一个简单redis驱动,调试windows版本的redis
  3. IIS负载均衡-Application Request Route详解第二篇:创建与配置Server Farm
  4. js文件处理File
  5. Python学习7 集合Set
  6. redis 关系数据库怎么转换 和_redis数据库设计(转)
  7. 轻量应用服务器支持带宽套餐升级至流量包套餐流程说明
  8. C++简易复数类的实现
  9. linux补丁服务,Linux补丁程序管理_补丁工具 _ ManageEngine Desktop Central
  10. 文件流操作,报“because it is being used by another process. ”错误解决
  11. 云课堂智慧职教网页版登录入口_云课堂智慧职教网页版
  12. 配置微信公众号之公众号绑定小程序
  13. VMware Workstation启动虚拟机时蓝屏
  14. 中国银联移动支付技术规范
  15. FlashFXP,flashfxp连接失败
  16. 关于机器学习中鲁棒性和泛化能力
  17. 小度总显示服务器连接失败,小度本地端口分配失败是什么意思
  18. 用几段代码搞定Java文件流
  19. SQL之LEFT JOIN,EIGHT JOIN,INSERT JOIN的区别
  20. ESP8266+micropython+HCSR04 超声波测距传感器

热门文章

  1. 1061 Dating
  2. 复杂SELECT语句执行过程
  3. ZJU-java进阶笔记 第七周(输入输出)
  4. php instr函数,oracle的instr函数用法
  5. java高并发编程(二)
  6. docker 数据卷与容器卷
  7. filter-mapping中的dispatcher使用
  8. leetcode Reverse Linked List
  9. WinForm容器内控件批量效验是否允许为空?设置是否只读?设置是否可用等方法分享...
  10. CSS float浮动的深入研究、详解及拓展(二)