一、邻接矩阵的DFS递归遍历
/*
Author: luuuuyang
Date: 2018/11/1
Version 1.0
Functions:创建无向网络邻接矩阵即带权无向图+递归DFS遍历
*/
#include<iostream>
#include<cstring>
using namespace std;
#define MaxInt 32767//表示无穷大(大于任何权值)
#define MVnum 100 //Max Vertex Number
typedef char VertexType;//顶点数据类型
typedef int ArcType;//权值数据类型
typedef struct{
VertexType vexs[MVnum];//保存顶点的数组
ArcType arcs[MVnum][MVnum];//arcs[i][j]=w
int vexnum,arcnum;//顶点数;边数
}AMGraph;
int LocateVex(AMGraph G,VertexType v){//查找v在G中的数组下标
for(int i=0;i<G.vexnum;i++)
if(G.vexs[i]==v){
return i;
break;
}
}
void CreateUDN(AMGraph &G){
cout<<"请输入无向网络的顶点数和边数:";
cin>>G.vexnum>>G.arcnum;//输入无向网的顶点数和边数
cout<<"请输入这"<<G.vexnum<<"顶点的名称:";
for(int i=0;i<G.vexnum;i++) cin>>G.vexs[i];//保存顶点信息
for(int i=0;i<G.vexnum;i++)//初始化所有边的权值为无限大
for(int j=0;j<G.vexnum;j++)
G.arcs[i][j]=MaxInt;
VertexType v1,v2;//定义两点和一边
ArcType w;
cout<<"请输入两顶点以及两顶点的权值:"<<endl;
for(int k=0;k<G.arcnum;k++){
cin>>v1>>v2>>w;//输入两点和一边
int i=LocateVex(G,v1);//查找v1,v2在顶点数组中的下标
int j=LocateVex(G,v2);
G.arcs[i][j]=w;//赋值 i->j=w j->i=w
G.arcs[j][i]=w;
}
}
bool visit[MVnum];
void DFS_AM(AMGraph G,int v){
cout<<G.vexs[v];
visit[v]=1;
for(int w=0;w<G.vexnum;w++)
if(G.arcs[v][w]!=MaxInt&&!visit[w]) DFS_AM(G,w);
}
int main(){
memset(visit,0,sizeof(visit));
AMGraph G;
CreateUDN(G);
cout<<"邻接矩阵递归DFS遍历的结果为:";
DFS_AM(G,0);
return 0;
}
二、邻接矩阵的DFS非递归遍历
/*
Author: luuuuyang
Date: 2018/11/3
Version 1.0
Functions:创建无向网络邻接矩阵即带权无向图+非递归DFS遍历
*/
#include<iostream>
#include<cstring>
using namespace std;
#define MaxInt 32767//表示无穷大(大于任何权值)
#define MVnum 100 //Max Vertex Number
typedef int ElemType;
typedef enum{
OVERFLOW=-1,
ERROR=0,
OK=1
}Status;
typedef struct StackNode{
ElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
Status InitStack(LinkStack &S){
S=NULL;
return OK;
}
bool StackEmpty(LinkStack S){
return S?false:true;
}
Status Push(LinkStack &S,ElemType e){
StackNode *p=new StackNode;
p->data=e;
p->next=S;
S=p;
return OK;
}
Status Pop(LinkStack &S,ElemType &e){
if(StackEmpty(S)) return ERROR;
e=S->data;
StackNode *p=S;
S=S->next;
delete p;
return OK;
}
typedef char VertexType;//顶点数据类型
typedef int ArcType;//权值数据类型
typedef struct{
VertexType vexs[MVnum];//保存顶点的数组
ArcType arcs[MVnum][MVnum];//arcs[i][j]=w
int vexnum,arcnum;//顶点数;边数
}AMGraph;
int LocateVex(AMGraph G,VertexType v){//查找v在G中的数组下标
for(int i=0;i<G.vexnum;i++)
if(G.vexs[i]==v){
return i;
break;
}
}
void CreateUDN(AMGraph &G){
cout<<"请输入无向网络的顶点数和边数:";
cin>>G.vexnum>>G.arcnum;//输入无向网的顶点数和边数
cout<<"请输入这"<<G.vexnum<<"顶点的名称:";
for(int i=0;i<G.vexnum;i++) cin>>G.vexs[i];//保存顶点信息
for(int i=0;i<G.vexnum;i++)//初始化所有边的权值为无限大
for(int j=0;j<G.vexnum;j++)
G.arcs[i][j]=MaxInt;
VertexType v1,v2;//定义两点和一边
ArcType w;
cout<<"请输入两顶点以及两顶点的权值:"<<endl;
for(int k=0;k<G.arcnum;k++){
cin>>v1>>v2>>w;//输入两点和一边
int i=LocateVex(G,v1);//查找v1,v2在顶点数组中的下标
int j=LocateVex(G,v2);
G.arcs[i][j]=w;//赋值 i->j=w j->i=w
G.arcs[j][i]=w;
}
}
bool visit[MVnum];
void DFS_AM(AMGraph G,LinkStack &S,int v){
Push(S,v);
visit[v]=1;
while(!StackEmpty(S)){
ElemType e;
Pop(S,e);
cout<<G.vexs[e];
for(int w=G.vexnum-1;w