题目:
用数组存储结构作为图的存储结构前提下,试编制图的输入及深度优先搜索遍历的有关子程序;
代码:
#include <iostream>
using namespace std;
#define MAX 100
int visited[MAX]; //初始化访问数组,0代表没有访问,1代表顶点已经访问过了
//定义图的邻接矩阵结构
typedef struct Graph{
char vertices[MAX]; //顶点表
int Edge[MAX][MAX]; //邻接矩阵
int verticeNum; //顶点数目
int edgeNum; //边的数目
}Graph;
//创建无向图(Undirected graph)的邻接矩阵
void createGrapUDG(Graph &G){
int i,j;
int n,e,x,y;
cin>>n; //输入顶点数量
G.verticeNum=n;
//初始化n个顶点的邻接矩阵
for(i=0;i<n;i++)
for(j=0;j<n;j++)
G.Edge[i][j]=0;
//初始化顶点表
for(i=0;i<n;i++)
cin>>G.vertices[i];
cin>>e; //输入边大的数量
G.edgeNum=e;
for(i=0;i<G.edgeNum;i++){
cin>>x>>y; //输入x到y的一条边
G.Edge[x-1][y-1]=1; //无向图的邻接矩阵是对称的
G.Edge[y-1][x-1]=1;
}
cout<<"邻接矩阵如下:"<<endl;
for(i=0;i<G.verticeNum;i++){
for(j=0;j<G.verticeNum;j++){
cout<<G.Edge[i][j]<<" ";
}
cout<<endl;
}
}
/**
*深度优先遍历的算法主体
*从顶点v开始遍历
**/
void DFS(Graph G,int v){
int w;
visited[v]=1;
cout<<G.vertices[v]<<" ";
for(w=0;w<G.verticeNum;w++){
if((G.Edge[v][w])!=0&&(visited[w]==0))
DFS(G,w);
}
}
void DFSTravere(Graph G){
int v;
for(v=0;v<G.verticeNum;v++)
visited[v]=0; //初始化已访问标记数据
for(v=0;v<G.verticeNum;v++)
if(visited[v]==0)
DFS(G,v);
}
int main() {
Graph G;
createGrapUDG(G);
DFSTravere(G);
return 0;
}
运行效果
输入
输出