题目链接: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 是否是一棵树。

样例输入
2
3 2
3 1
3 2
5 5
3 1
3 2
4 5
1 2
4 1
样例输出
YES
NO

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

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

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

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

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

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

 #include<cstdio>
using namespace std;
struct Edge{
int u,v;
};
int n,m;
int par[],ran[];
void init()
{
for(int i=;i<=n;i++) par[i]=i,ran[i]=;
}
int find(int x)
{
if(par[x] == x) return x;
else return( par[x] = find(par[x]) );
}
void unite(int x,int y)
{
x=find(x),y=find(y);
if(x == y) return;
if(ran[x] < ran[y]) par[x]=y;
else
{
par[y]=x;
if(ran[x] == ran[y]) ran[x]++;
}
}
bool isSame(int x,int y){return( find(x) == find(y) );}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();
for(int i=;i<=m;i++)
{
int from,to;
scanf("%d%d",&from,&to);
if(!isSame(from,to)) unite(from,to);
}
bool flag=;
int pa=find();
for(int i=;i<=n;i++)
{
if(pa!=find(i)){
flag=;
break;
}
}
if(flag && m==n-) printf("YES\n");
else printf("NO\n");
}
}

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

 #include<cstdio>
#include<vector>
using namespace std;
struct Edge{
int u,v;
};
vector<Edge> adj[];
int n,m;
bool vis[];
void dfs(int now)
{
vis[now]=;
for(int i=;i<adj[now].size();i++)
{
Edge edge=adj[now][i];
int next=edge.v;
if(!vis[next]) dfs(next);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
adj[i].clear();
vis[i]=;
}
for(int i=;i<=m;i++)
{
int from,to;
scanf("%d%d",&from,&to);
adj[from].push_back((Edge){from,to});
adj[to].push_back((Edge){to,from});
}
dfs();
bool flag=;
for(int i=;i<=n;i++)
{
if(!vis[i]){
flag=;
break;
}
}
if(flag && m==n-) printf("YES\n");
else printf("NO\n");
}
}

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

 #include<cstdio>
#include<vector>
#include<queue>
using namespace std;
struct Edge{
int u,v;
};
vector<Edge> adj[];
int n,m;
bool vis[];
void bfs()
{
queue<int> q;
q.push();
vis[]=;
while(!q.empty())
{
int now=q.front();q.pop();
for(int i=;i<adj[now].size();i++)
{
Edge edge=adj[now][i];
int next=edge.v;
if(!vis[next]){
vis[next]=;
q.push(next);
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
adj[i].clear();
vis[i]=;
}
for(int i=;i<=m;i++)
{
int from,to;
scanf("%d%d",&from,&to);
adj[from].push_back((Edge){from,to});
adj[to].push_back((Edge){to,from});
}
bfs();
bool flag=;
for(int i=;i<=n;i++)
{
if(!vis[i]){
flag=;
break;
}
}
if(flag && m==n-) printf("YES\n");
else printf("NO\n");
}
}

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. XMPP协议实现即时通讯底层书写 (一)--从RFC6121阅读開始

    Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence ok,额瑞巴蒂,说好的阅读RFC61 ...

  2. sublime自定义代码段

    打开tools>developer>new snippet 默认代码 <snippet> <content><![CDATA[ Hello, ${1:this ...

  3. Linux oracle数据库创建表空间、用户并赋予权限

    管理员用户登录oracle数据库 1.创建临时表空间 select name from v$tempfile;查出当前数据库临时表空间,主要是使用里面的存放路径: 得到其中一条记录/opt/oracl ...

  4. 利用BurpSuite实现半自动化盲注

    为了方便演示,这里直接使用字符,构造SQL Payload: ?id= and substring(user(),,)='r' 1.使用Burp抓包,发送到Intruder,设置模式和变量 2.设置字 ...

  5. Unity绘制Png图片

    using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; publ ...

  6. 冥想_ PHP抽奖程序概率算法

    //概率算法,6个奖项 $prize_arr = array( '0' => array('id'=>1,'prize'=>'iphone6','v'=>1), '1' =&g ...

  7. 《C++ Primer Plus》16.4 泛型编程 学习笔记

    STL是一种泛型编程(generic programming).面向对象编程关注的是编成的数据方面,而泛型编程关注的是算法.它们之间的共同点是抽象和创建可重用代码,单他们的理念决然不同.泛型编程旨在编 ...

  8. 在windows2003下可以用哪个版本的JDK

    JDK在windows下只区分32位还是64位的, 而windows 2003有32位也有64位的,你先查查看自己机器是哪种,参照下面这个经验http://jingyan.baidu.com/arti ...

  9. 【Linux】 解决报错: ImportError: libSM.so.6: cannot open shared object file: No such file or directory

    centos7 +  python3.6.4 我使用 pip3 install opencv-python 安装了opencv-python  之后,在使用 import cv2  报错如下 报错原因 ...

  10. c++11 delete禁用函数

    c++11添加了delete关键字. 不想用那个函数,在那个函数后面加 = delete就可以了: 比如: 在函数重载中,可用 delete 来滤掉一些函数的形参类型,如下: bool IsLucky ...