设计算法判断一个无向图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;
}
few,afew的区别……否定意义和肯定意义是什么意思?表示肯定意义:alittle/afew有一点 2020-03-30 …
任务说明:输入三角形的三条边a,b,c,判断它们能否构成三角形.若能构成三角形,指出是何种三角形. 2020-04-06 …
如图所示为五个立体图形:(1)数一数每个图形各有多少个顶点?多少条棱?(2)一个多面体的顶点数,棱 2020-04-27 …
一.试说明下列说法正确与否,并说明理由:1.数轴上表示+5的点只有一个;2.数轴上到原点的距离等于 2020-06-05 …
急!求判断对错判断下列说法是否正确:所有的有理数都可以用数轴上的点表示,反过来,数轴上所有的点都表 2020-07-30 …
掷一枚均匀的骰子两次,设X表示出现的点数之和,Y表示第一次出现的点数减去第二次出现的点数.求:(1 2020-08-02 …
假定用两个一维数组L[n+1]和R[n+1]作为有n个结点的二叉树的存储结构,L[i]和R[i]分 2020-08-03 …
一个关于偏导数的问题二元函数f(x,y):当(x,y)≠(0,0)时f(x,y)=(xy)/(x^2 2020-11-01 …
画分段函数图象时,一定要考虑区间端点是否包含在内,若端点包含在内,则用实点.表示,若端点不包含在内, 2020-12-08 …
画分段函数图象时,一定要考虑区间端点是否包含在内,若端点包含在内,则用实点.表示,若端点不包含在内, 2020-12-08 …