图的深度优先搜索可以用来解决很多问题,例如可以用于产生图的生成树。程序代码在VC++6.0和Dev-C++下编译通过。
算法的输入和输出为:
#include "stdio.h"
#include "stdlib.h"
#define MAX_VERTEX_NUM 100
typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct { // 图的定义
char vexs[MAX_VERTEX_NUM];
AdjMatrix arcs; // 弧的信息
int vexnum, arcnum; // 顶点数,弧数
} MGraph;
void DFS(MGraph g, int k, int visited[])
{
int w;
visited[k]=1;
for(w=0;w<g.vexnum;w++)
{
if(g.arcs[k][w]==1 && visited[w]==0)
{
printf("边(%c--%c)\n",g.vexs[k],g.vexs[w]);
DFS(g,w,visited);
}
}
}
int getIndex(char name, MGraph g)
{
int i;
for(i=0;i<g.vexnum;i++)
if(g.vexs[i]==name)
return i;
return -1;
}
int main()
{
int i,j,n,visited[1000];
char n1,n2;
MGraph g;
printf("Input number of node: ");
scanf("%d",&n);
g.vexnum=n;
for(i=0;i<n;i++)
{
printf("node (%d)= ",i);
fflush(stdin);
scanf("%c",&(g.vexs[i]));
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
g.arcs[i][j]=0;
for(;;)
{
printf("Insert edge i-j: ");
fflush(stdin);
scanf("%c%c",&n1,&n2);
i=getIndex(n1,g);
j=getIndex(n2,g);
if(i==-1 && j==-1)
break;
g.arcs[i][j]=1;
g.arcs[j][i]=1;
}
for(i=0;i<n;i++)
visited[i]=0;
printf("深度优先搜索产生的生成树如下:\n");
for(i=0;i<n;i++)
if(visited[i]==0)
DFS(g, i, visited);
printf("\n");
return 0;
}