题目链接:http://hihocoder.com/problemset/problem/1322

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定一个包含 N 个顶点 M 条边的无向图 G ,判断 G 是不是一棵树。

输入

第一个是一个整数 T ,代表测试数据的组数。 (1 ≤ T ≤ 10)

每组测试数据第一行包含两个整数 N 和 M 。(2 ≤ N ≤ 500, 1 ≤ M ≤ 100000)

以下 M 行每行包含两个整数 a 和 b ,表示顶点 a 和顶点 b 之间有一条边。(1 ≤ ab ≤ N)

输出

对于每组数据,输出YES或者NO表示 G 是否是一棵树。

样例输入
  1. 2
  2. 3 2
  3. 3 1
  4. 3 2
  5. 5 5
  6. 3 1
  7. 3 2
  8. 4 5
  9. 1 2
  10. 4 1
样例输出
  1. YES
  2. NO

首先,如何判断一个图是不是一棵树。

第一个想到的当然是n-1条边;

那么光n-1条边就够了吗,显然还有一个条件,就是这个图是连通图。

它给的样例中,边不重复出现,那么判断m是否等于n-1其实非常方便;

所以我们只要想办法得到一个图是不是连通图即可。

从某种角度上来讲,可以说是一道裸的并查集模板题,那可以说就是一道水题了。

  1. #include<cstdio>
  2. using namespace std;
  3. struct Edge{
  4. int u,v;
  5. };
  6. int n,m;
  7. int par[],ran[];
  8. void init()
  9. {
  10. for(int i=;i<=n;i++) par[i]=i,ran[i]=;
  11. }
  12. int find(int x)
  13. {
  14. if(par[x] == x) return x;
  15. else return( par[x] = find(par[x]) );
  16. }
  17. void unite(int x,int y)
  18. {
  19. x=find(x),y=find(y);
  20. if(x == y) return;
  21. if(ran[x] < ran[y]) par[x]=y;
  22. else
  23. {
  24. par[y]=x;
  25. if(ran[x] == ran[y]) ran[x]++;
  26. }
  27. }
  28. bool isSame(int x,int y){return( find(x) == find(y) );}
  29. int main()
  30. {
  31. int t;
  32. scanf("%d",&t);
  33. while(t--)
  34. {
  35. scanf("%d%d",&n,&m);
  36. init();
  37. for(int i=;i<=m;i++)
  38. {
  39. int from,to;
  40. scanf("%d%d",&from,&to);
  41. if(!isSame(from,to)) unite(from,to);
  42. }
  43. bool flag=;
  44. int pa=find();
  45. for(int i=;i<=n;i++)
  46. {
  47. if(pa!=find(i)){
  48. flag=;
  49. break;
  50. }
  51. }
  52. if(flag && m==n-) printf("YES\n");
  53. else printf("NO\n");
  54. }
  55. }

当然,如果不用并查集,用搜索的话,又可以是一道非常裸的DFS题?……embarrassing……

  1. #include<cstdio>
  2. #include<vector>
  3. using namespace std;
  4. struct Edge{
  5. int u,v;
  6. };
  7. vector<Edge> adj[];
  8. int n,m;
  9. bool vis[];
  10. void dfs(int now)
  11. {
  12. vis[now]=;
  13. for(int i=;i<adj[now].size();i++)
  14. {
  15. Edge edge=adj[now][i];
  16. int next=edge.v;
  17. if(!vis[next]) dfs(next);
  18. }
  19. }
  20. int main()
  21. {
  22. int t;
  23. scanf("%d",&t);
  24. while(t--)
  25. {
  26. scanf("%d%d",&n,&m);
  27. for(int i=;i<=n;i++)
  28. {
  29. adj[i].clear();
  30. vis[i]=;
  31. }
  32. for(int i=;i<=m;i++)
  33. {
  34. int from,to;
  35. scanf("%d%d",&from,&to);
  36. adj[from].push_back((Edge){from,to});
  37. adj[to].push_back((Edge){to,from});
  38. }
  39. dfs();
  40. bool flag=;
  41. for(int i=;i<=n;i++)
  42. {
  43. if(!vis[i]){
  44. flag=;
  45. break;
  46. }
  47. }
  48. if(flag && m==n-) printf("YES\n");
  49. else printf("NO\n");
  50. }
  51. }

然后又随手码了一个BFS模板……在新加坡就是这么刷水题的……感觉对不起自己现在熬的夜……难受……

  1. #include<cstdio>
  2. #include<vector>
  3. #include<queue>
  4. using namespace std;
  5. struct Edge{
  6. int u,v;
  7. };
  8. vector<Edge> adj[];
  9. int n,m;
  10. bool vis[];
  11. void bfs()
  12. {
  13. queue<int> q;
  14. q.push();
  15. vis[]=;
  16. while(!q.empty())
  17. {
  18. int now=q.front();q.pop();
  19. for(int i=;i<adj[now].size();i++)
  20. {
  21. Edge edge=adj[now][i];
  22. int next=edge.v;
  23. if(!vis[next]){
  24. vis[next]=;
  25. q.push(next);
  26. }
  27. }
  28. }
  29. }
  30. int main()
  31. {
  32. int t;
  33. scanf("%d",&t);
  34. while(t--)
  35. {
  36. scanf("%d%d",&n,&m);
  37. for(int i=;i<=n;i++)
  38. {
  39. adj[i].clear();
  40. vis[i]=;
  41. }
  42. for(int i=;i<=m;i++)
  43. {
  44. int from,to;
  45. scanf("%d%d",&from,&to);
  46. adj[from].push_back((Edge){from,to});
  47. adj[to].push_back((Edge){to,from});
  48. }
  49. bfs();
  50. bool flag=;
  51. for(int i=;i<=n;i++)
  52. {
  53. if(!vis[i]){
  54. flag=;
  55. break;
  56. }
  57. }
  58. if(flag && m==n-) printf("YES\n");
  59. else printf("NO\n");
  60. }
  61. }

hihocoder 1322 - 树结构判定 - [hiho一下161周][模板题/水题]的更多相关文章

  1. hihocoder 1331 - 扩展二进制数 - [hiho一下168周]

    题目链接:http://hihocoder.com/problemset/problem/1331 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 我们都知道二进制数的每 ...

  2. hihocoder 1330 - 数组重排 - [hiho一下167周][最小公倍数]

    题目链接:https://hihocoder.com/problemset/problem/1330 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi想知道,如果他 ...

  3. hihocoder 1320 - 压缩字符串 - [hiho一下160周]

    这道题目可以说是一道非常好非常一颗赛艇的DP题了. 需要注意的是,其中情形3),字符串必然能完全转化为 N(str)形式,如果有N(str1)M(str2)等等另外样式,应该首先使用拼接形式对其进行划 ...

  4. hihocoder1322 树结构判定(161周)

    hihocoder1322 : 树结构判定(161周) 题目链接 思路: 无向图中判断是不是一棵树. 并查集判断.判断是不是只有一个连通分量.并且该联通分量中没有环.没有环的判定很简单就是看边的数目和 ...

  5. 20175316盛茂淞 《java程序设计》第三周课堂测试错题总结

    20175316盛茂淞 <java程序设计>第三周课堂测试错题总结 出现问题 错题总结 题目1 在Ubuntu中用自己的有位学号建一个文件,教材p87 Example4_15 1. 修改代 ...

  6. hihocoder 1305 - 区间求差 - [hiho一下152周][区间问题]

    题目链接:https://hihocoder.com/problemset/problem/1305 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个区间集合 A ...

  7. hihocoder 1334 - Word Construction - [hiho一下第170周][状态压缩+DFS]

    题目链接:https://hihocoder.com/problemset/problem/1334 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given N wo ...

  8. hihoCoder#1322(树的判定)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个包含 N 个顶点 M 条边的无向图 G ,判断 G 是不是一棵树. 输入 第一个是一个整数 T ,代表测试数据的组 ...

  9. hihoCoder 树结构判定(并查集)

    思路:树满足两个条件: 1.顶点数等于边数加一 2.所有的顶点在一个联通块 那么直接dfs或者并查集就可以了. AC代码 #include <stdio.h> #include<st ...

随机推荐

  1. Linux+Redis实战教程_day03_1、Redis-LinkedList【重点】

    1.redis-LinkedList[重点] Java List : 数组ArrayList 链表LinkedList 为什么redis选取了链表? Redis操作中,最多的操作是进行元素的增删 使用 ...

  2. 8 -- 深入使用Spring -- 4...3 AOP的基本概念

    8.4.3 AOP的基本概念 AOP从程序运行角度考虑程序的流程,提取业务处理过程的切面.AOP面向的是程序运行中各个步骤,希望以更更好的方式来组合业务处理的各个步骤. AOP框架并不与特定的代码耦合 ...

  3. jackson 转换 enum 类型

    REST API 接口要求 requster json 的 lifeCycle 域只能填 YOUNG, OLD,对于其他的 lifeCycle,都要给 requester 返回 bad request ...

  4. Unique ID Generate Notes

    Unique ID generation in distributed systems http://www.slideshare.net/davegardnerisme/unique-id-gene ...

  5. redis 列表

    Redis 列表(List) Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 232 - 1 个元素 (4294967 ...

  6. MySQL on Linux 部署手册

    1. 背景 MySQL为开源数据库,因此可以基于源码实现安装.基于源码安装有更多的灵活性.也就是说我们可以针对自己的硬件平台选用合适的编译器来优化编译后的二进制代码,根据不同的软件平台环境调整相关的编 ...

  7. .Net学习心得

      把握自己就是,就是时时拥一颗清澈的心,拥有一片明朗的情怀,缓缓地,从2014的国度里跨进了2015,而我们也就随之告别了2个月的学习之旅,在这里我们拥有了如白色漂渺的梦,黯然升起,在彩色的云霄里飘 ...

  8. Spring系列之访问数据库

    一.概述 Spring的数据访问层是以统一的数据访问异常层体系为核心,结合JDBC API的最佳实践和统一集成各种ORM方案,完成Java平台的数据访问. 二.JDBC API的最佳实践 Spring ...

  9. tp3.2中怎么访问分类及子分类下面的文章

    在项目开发过程中,我们可能会遇到在进入文章分类时需要遍历文章分类及文章子分类下面的文章的情况,具体解决步骤如下: 一.为便于理解,这里列出用到的表及字段 文章分类表(article_cate) 文章表 ...

  10. C数组&结构体&联合体快速初始化

    背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组某些元 ...