设计算法判断一个无向图G是否为树。若是,输出“Yes!”;否则输出“No!”。输入格式:第1行是空格分隔的两个整数n和m,分别表示无向图的顶点数和边数,n
输入格式:
第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=,它表示.重力G和质量m的比 2020-05-14 …
英语翻译语言与非语言行为、谈判风格、决策方式、协议形式等文化差异对国际商务谈判都有着重要的影响作用 2020-05-21 …
判断相等(1811:16:18)在三角形ABC中,∠ACB=90度,以AC为一边向形外做正方形AC 2020-06-02 …
如图,多面体ABCDEFG中,AB,AC,AD两两垂直,平面ABC∥平面DEFG,平面BEF∥平面 2020-06-27 …
已知正方形ABCD.E,F,分别是AB,CD的中点将三角形ADE沿DE折起记二面角A-DE-C的大 2020-06-27 …
求算法:欧拉路Description定义:图G的欧拉回路是包含图G所有边的一个简单回路,而欧拉路径 2020-08-01 …
设计算法判断一个无向图G是否为树。若是,输出“Yes!”;否则输出“No!”。输入格式:第1行是空格 2020-11-07 …
一个人腾空而起,对着面前的墙壁狠踹了一脚,此时墙壁受力为F,若此人体重为G,请问F与G是否有关?若有 2020-11-10 …
数学里的素数方程是否有无限解我构思了一个方程:p^n+q^n=g是否对任意整数n都有无限的素数解(p 2020-11-22 …
关于稀释倍数的问题,我还想问问你!1、如果将“100ml水”改成“100ml95%乙醇”,那么质量稀 2021-02-05 …