dfs。不过这道题增加了我对树的理解,树假设有n个节点,那么边的条数一定是n-1,多一条少一条都不可以,而且通过任意一个点都能搜到其他的点(废话),所以刚开始我还在想需不需要判断环,好在题目给的数据比较友好,通过走捷径判断边的条数就好。
时间限制:
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 ≤ a, b ≤ 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
代码:
#include<iostream>
#include<vector>
#include<stdio.h>
#include<string.h>
using namespace std;
vector<int>g[600];
int vis[600];
int n,m;
int cnt;
void dfs(int x)
{
for(int i=0;i<g[x].size();i++)
{
int lala=g[x][i];
if(!vis[lala])
{
vis[lala]=1;
cnt++;
dfs(lala);
}
}
}
int main()
{
int t,u,v;
cin>>t;
while(t--)
{
cin>>n>>m;
memset(vis,0,sizeof(vis));
//memset(g,0,sizeof(g));
for(int i=1;i<=600;i++)
{
g[i].clear();
}
cnt=1;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
if(m!=n-1)
cout<<"NO"<<endl;
else
{
vis[1]=1;
dfs(1);
// cout<<cnt<<endl;
if(cnt==n)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}