5441: 数据结构实验--图的深度优先搜索![分享至QQ空间](http://210.32.82.1/acmhome/forum/images/ico_qzone.gif)
时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte
总提交:137 测试通过:67
总提交:137 测试通过:67
描述
图的遍历操作是从图的某一顶点出发,依次访问图中其余顶点,且每个顶点仅被访问一次。请完成无向连通图的深度优先搜索。
邻接矩阵的类型定义为:
typedef struct
{
int arcs[MAXVEX][MAXVEX];
int vexnum;
}Mgraph;
主函数代码已经给出,请将其余代码补充完整,提交时请勿包含给定代码。
int main() { Mgraph g; int m,n,i; while(scanf("%d%d",&m,&n)!=EOF) { creat_Mgraph(&g,m,n); for(i=1;i<=m;i++) visited[i]=0; dfs(g,1); printf("\n"); } return 0; }
输入
输入数据为多组,每组数据包含多行,第一行为2个整数n,e,n为图的顶点数,e为边数,接下来是e行,每行2个整数,是一个顶点对,代表一条边所依附的两个顶点。例如图如下:
输入数据为:
4 5
1 2
1 3
1 4
2 4
3 4
输出
每个图的深度优先搜索序列,每个序列占一行,输出的每个顶点后有一个空格。
样例输入
3 31 21 32 35 61 21 32 43 42 54 5
样例输出
1 2 3 1 2 4 3 5
提示
如题目描述中图所示,顶点值为整型,亦可看为顶点序号,取值从1开始。图中顶点数不超过30个,遍历时由顶点值最小的顶点开始。
题目来源
#include <stdio.h>
#define MAXVEX 31
typedef struct
{
int arcs[MAXVEX][MAXVEX];
int vexnum;
}Mgraph;
int visited[MAXVEX];
void Clear(Mgraph *g,int m)
{
int i,j;
for(i=1;i<=m;i++)
{
for(j=1;j<=m;j++)
{
g->arcs[i][j]=g->arcs[j][i]=0;
}
}
}
void creat_Mgraph(Mgraph *g,int m,int n)
{
Clear(g,m);
g->vexnum=m;
int i,x,y;
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
g->arcs[x][y]=g->arcs[y][x]=1;
}
}
void dfs(Mgraph g,int n)
{
if(n==1)
{
visited[n]=1;
printf("%d ",n);
}
int i;
for(i=1;i<=g.vexnum;i++)
{
if(g.arcs[i][n]==1&&visited[i]==0)
{
visited[i]=1;
printf("%d ",i);
dfs(g,i);
}
}
return;
}
int main()
{
Mgraph g;
int m,n,i;
while(scanf("%d%d",&m,&n)!=EOF)
{
creat_Mgraph(&g,m,n);
for(i=1;i<=m;i++)
visited[i]=0;
dfs(g,1);
printf("\n");
}
return 0;
}