该程序是用图的邻接举着实现的。如果想用图的邻接链表实现DFS算法,只要把该程序中的firstAdj()和nextAdj()以及图的创建等操作改用邻接链表实现即可,其他的如DFS主程序框架可以不用修改。
temp.cpp
//图的深度优先搜索(DFS)
//图用邻接矩阵表示
#include<iostream>
#include<fstream>
#include "temp.h"
using namespace std;
int LocateVex(MGraph G, VertexType v){
//在图G的vexs(顶点)中找值为v的元素的下标,如果没有则返回-1;
for(int i = 0; i < G.vexnum; i++){
if(G.vexs[i] == v){
return i;
}
}
return -1;
}
Status CreateMGraph(MGraph &G){
//创建图G,输入(读文件)的值有
//1.图的顶点数,边/弧的数目,图的类型
//2.依次输入顶点的值
//3.依次输入一条边的起点和终点;
ifstream in;
in.open("data3.txt", ios::in);
cout<<"下列数据从文件data3.txt读入"<<endl<<endl;
cout<<"请输入图的顶点数,边/弧的数目,图的类型"<<endl;
int kind;
in>>G.vexnum>>G.arcnum>>kind;//从文件读入数据,遇到任何结束标记(如空格和换行)则停止。
switch(kind){
case 0 :
G.kind = NG;
break;
case 1:
G.kind = DG;
break;
case 2:
G.kind = NW;
break;
case 3:
G.kind = DW;
break;
}
cout<<"请依次输入顶点的值"<<endl;
for(int i = 0; i < G.vexnum; i++){
in>>G.vexs[i];
}
for(int i = 0; i < G.vexnum; i++){
for(int j = 0; j < G.vexnum; j++){
G.arcs[i][j] = 0;
}
}
cout<<"请依次输入一条边的起点和终点:"<<endl;
for(int k = 0; k < G.arcnum; k++){
int v1, v2, i, j;
in>>v1>>v2;
i = LocateVex(G, v1);
j = LocateVex(G, v2);
G.arcs[i][j] = 1;
if(G.kind == NG)//无向图
G.arcs[j][i] = 1;
}
cout<<endl;
return OK;
}
int FirstAdj(MGraph G, int v){
for(int i = 0; i < G.vexnum; i++){
if(G.arcs[v][i]){
return i;
}
}
return -1;
}
int NextAdj(MGraph G, int v, int w){
for(int i = w + 1; i < G.vexnum; i++){
if(G.arcs[v][i]){
return i;
}
}
return -1;
}
void visitFuc(MGraph G, int v){
cout<<G.vexs[v]<<endl;
}
void DFS(MGraph G, int v, int visited[]) {
//从序号为v的顶点出发,对图G做一次深度优先搜索遍历
visitFuc(G, v); //访问v
visited[v]=TRUE; // 打上访问标记
for(int w = FirstAdj(G, v); w != -1; w = NextAdj(G, v, w) ){
if( !visited[w] )
DFS(G, w, visited);
}
}
void DFSTraverse(MGraph G){
//深度优先搜索遍历图G
int visited[VISITED_NUMBER];
for(int v=0; v < G.vexnum;v++){
visited[v]=FALSE; //初始化
}
for(int v=0; v<G.vexnum;v++){
if(!visited[v]){
DFS(G,v, visited); //若顶点v未被访问,从v开始遍历
cout<<"这是一次DFS"<<endl;
}
}
}
int main(){
MGraph G;
CreateMGraph(G);
DFSTraverse(G);
}
temp.h
#define VertexType int
#define AdjMatrix int
typedef enum{NG, DG, NW, DW}GraphKind;
#define Status int
#define MAX_N 10
#define OK 1
#define ERROR 0
#define FALSE 0
#define TRUE 1
#define VISITED_NUMBER 10
typedef struct{
VertexType vexs[MAX_N];//表示顶点的数组;
AdjMatrix arcs[MAX_N][MAX_N];//表示边的二维数组;
int vexnum,arcnum;//顶点和边的个数;
GraphKind kind;
}MGraph;//定义图MGraph;用邻接矩阵表示。
data3.txt
5 4 0
1 2 3 4 5
1 2
1 3
2 4
2 3
本文介绍了如何使用邻接矩阵实现图的深度优先搜索算法。通过修改firstAdj()和nextAdj()以及图的创建部分,可以将此实现转化为邻接链表的DFS算法。
2060

被折叠的 条评论
为什么被折叠?



