早教吧 育儿知识 作业答案 考试题库 百科 知识分享

设计算法判断一个无向图G是否为树。若是,输出“Yes!”;否则输出“No!”。输入格式:第1行是空格分隔的两个整数n和m,分别表示无向图的顶点数和边数,n

题目详情
设计算法判断一个无向图G是否为树。若是,输出“Yes!”;否则输出“No!”。
输入格式:
第1行是空格分隔的两个整数n和m,分别表示无向图的顶点数和边数,n<=10000,m<=100000。
第2到n+1行,每行两个整数a和b,表示顶点a和b之间有一条边,1 < = a,b <=n 。
键盘输入,不必检查输入错误,输入确保正确。
输出格式:
屏幕上显示一行,“yes!”或 “no!”.行末有回车。

样例1

样例2

输入:
4 3
1 2
2 3
3 1
输出:
No!

输入:
2 1
1 2

输出:
Yes!
▼优质解答
答案和解析

首先题目中有一处应该是错了。

第2到n+1行,应该改为,第2到m+1行


方法:DFS搜索图,图中的边只可能是树边或反向边,一旦发现反向边,则表明存在环。该算法的复杂度为O(V)。


代码:

/*
设计算法判断一个无向图G是否为树。若是,输出“Yes!”;否则输出“No!”。
输入格式:
第1行是空格分隔的两个整数n和m,分别表示无向图的顶点数和边数,n<=10000,m<=100000。
第2到m+1行,每行两个整数a和b,表示顶点a和b之间有一条边,1 < = a,b <=n 。
键盘输入,不必检查输入错误,输入确保正确。
输出格式:
屏幕上显示一行,“yes!”或 “no!”.行末有回车。

样例1
   
样例2

输入:
4 3
1 2
2 3
3 1
输出:
No!
   
输入:
2 1
1 2
 
输出:
Yes!
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

const int N=10000, M=100000;
bool edge[N][N];   // 数组记录两点是否存在边
bool visit[N];  // 标记该节点是否访问过

bool DFS_check(int x, int y=-1)
{
if (visit[x])
return false;

visit[x] = true;
int i;
for (i=0;i<N;i++)
if (edge[x][i] && i!=y)
if (visit[i])
return false;
else
if (!DFS_check(i, x))
return false;

return true;
}

int main()
{
int n,m;
scanf("%d%d",&n,&m);

memset(edge,false,sizeof(edge));
int i,x,y;
for (i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
edge[x-1][y-1] = true;
edge[y-1][x-1] = true;
}

memset(visit,false,sizeof(visit));
bool result = DFS_check(0);
if (result)
for (i=0;i<n;i++)
if (!visit[i])
result = false;
if (result)
printf("Yes!\n");
else
printf("No!\n");

system("pause");
return 0;
}
看了设计算法判断一个无向图G是否为...的网友还看了以下:

输入输出接口是PNP、NPN型是什么意思,它和3极管PNP、NPN什么区别?我们说的输入输出接口是  2020-05-17 …

运输和输运是近义词吗?运输和输运是意思相同的倒顺词吗?说出原因怎么会没有输运这个词呢  2020-05-22 …

下关有关输入和输出的叙述,正确的是()A.胃腺细胞分泌消化酶需要能量,不需要载体B.乙醇通过细胞膜  2020-06-23 …

以下关于生长素的产生、运输和分布情况的叙述,不正确的是()A.生长素合成的主要部位是幼嫩的芽、叶和  2020-06-25 …

求教:用VHDL写一个8位加法器,电路的输入输出信号分别为:A7-A0:8位的第一操作数A,输入B  2020-07-09 …

如图表示人体消化系统部分结构,对该图描述错误的是()A.[④]是消化和吸收食物的主要场所B.[①]是  2020-11-04 …

假设法解题某运输公司为商场运送1000个玻璃杯,双方商定每个玻璃杯运费为1元,如果打碎1个,运输公司  2020-11-07 …

用原理图输入设计方法进行数字电路系统设计,哪一种说法是正确的:A.原理图输入设计方法直观便捷,很适合  2020-12-15 …

有一列数,第一和第二两个数分别用字母A、B来表示,接着继续写数,第三个数为第一和第二个数的和,第四个  2020-12-23 …

下列关于血量和输血说法错误的是()A.成年人的血量大致相当于本人体重的7%-8%B.大量输血时,必须  2020-12-24 …