设计算法判断一个无向图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;
}
给出一个程序如下图,若输入m=546,n=210,则输出.INPUT“m,n=”;m,nDOr=m 2020-04-07 …
求纠错!输入整数 m 和正整数 n ,按下列公式计算 s输入整数 m 和正整数 n ,按下列公式计 2020-05-17 …
如图,平行四边形ABCD中,M为DC中点,N为BC中点,设向量AB=b,向量AD=d,向量AM=m 2020-07-22 …
已知抛物线C的顶点在原点,焦点在y轴上,抛物线上点M(x,4)(x>0)到准线的距离是5.(Ⅰ)求 2020-07-31 …
如图程序框图的算法思路来源于我国古代数学名著《九章算术》中的“辗转相除法”,执行该程序框图,若输入 2020-08-03 …
如图的程序图的算法思路中是一种古老而有效的算法--辗转相除法,执行改程序框图,若输入的m,n的值分 2020-08-03 …
如图程序框图的算法思路源于欧几里得名著《几何原本》中的“辗转相除法”,执行该程序框图,若输入m,n 2020-08-03 …
任意给一个非零数,按如图所示程序计算,写出输出的结果,多做几次,你有什么发现?请用整式的有关知识说明 2020-11-18 …
小强发明了一个魔术盒,当输入数对(a,b)时,输出结果为a²-3ab+b²,已知输入(-1,m)输入 2020-12-10 …
如图程序框图的算法思路源于古希腊数学家欧几里得的“辗转相除法”,执行该程序框图,若输入的m,n分别为 2020-12-31 …