/*-----------------------------------------------*/
/* 邻接矩阵的DFS */
// 基于 数据结构(14) 中的邻接矩阵的结构
#include <iostream>
using namespace std;
typedef char VertexType;
typedef int EdgeType;
const int MAXVEX = 100;
const int INFINITY = 65535;
typedef struct
{
VertexType vexs[MAXVEX];
EdgeType arc[MAXVEX][MAXVEX];
int numVertexes, numEdges;
} MGraph;
void CreateMGraph(MGraph &G)
{
int i,j,k,w;
cout<<"输入顶点数和边数:";
cin>>G.numVertexes>>G.numEdges;
cout<<"输入顶点信息: "<<endl;
for(i=0;i<G.numVertexes;i++)
cin>>G.vexs[i];
for(i=0;i<G.numVertexes;i++)
for(j=0;j<G.numVertexes;j++)
G.arc[i][j] = INFINITY;
for(k=0;k<G.numEdges;k++)
{
cout<<"输入边(vi,vj)上的下标i,下标j和权w:"<<endl;
cin>>i>>j>>w;
G.arc[i][j] = w;
G.arc[j][i] = G.arc[i][j];
}
}
/*-----------------------------------------------*/
// DFS
bool visit[MAXVEX]; // 用于标记顶点是否已被遍历
void DFS(MGraph G, int i) // DFS搜索
{
int j;
visit[i] = true; // 当前顶点标记为 已遍历
cout<<G.vexs[i]<<ends; // 输出顶点信息(可改为其他操作)
for(j=0;j<G.numVertexes;j++) // 遍历与当前顶点有联系的其他顶点
if(G.arc[i][j] == 1 && !visit[j])
DFS(G,j); // 递归
}
// DFSTraverse
void DFSTraverse(MGraph G)
{
int i;
for(i=0;i<G.numVertexes;i++) // 初始化标记数组为 未遍历
visit[i] = false;
for(i=0;i<G.numVertexes;i++) // 对每一个没有遍历过的顶点进行DFS
if(!visit[i])
DFS(G,i);
}
int main()
{
MGraph G;
CreateMGraph(G);
DFSTraverse(G);
return 0;
}
/*-----------------------------------------------*/
/* 邻接表的DFS */
// 基于 数据结构(14) 中的邻接表的结构
#include <iostream>
using namespace std;
const int MAXVEX = 100;
typedef char VertexType;
typedef int EdgeType;
typedef struct EdgeNode
{
int adjvex;
EdgeType weight;
struct EdgeNode *next;
} EdgeNode;
typedef struct VertexNode
{
VertexType data;
EdgeNode *firstedge;
} VertexNode, AdjList[MAXVEX];
typedef struct
{
AdjList adjList;
int numVertexes, numEdges;
} GraphAdjList;
void CreateALGraph(GraphAdjList &G)
{
int i,j,k,w;
EdgeNode *e;
cout<<"输入顶点数和边数:";
cin>>G.numVertexes>>G.numEdges;
cout<<"输入各顶点的信息:"<<endl;
for(i=0;i<G.numVertexes;i++)
{
cin>>G.adjList[i].data;
G.adjList[i].firstedge = NULL;
}
for(k=0;k<G.numEdges;k++)
{
cout<<"输入边(vi,vj)上的顶点序号:"<<endl;
cin>>i>>j>>w;
e = new EdgeNode;
e->adjvex = j;
e->weight = w;
e->next = G.adjList[i].firstedge;
G.adjList[i].firstedge = e;
e->adjvex = i;
e->weight = w;
e->next = G.adjList[j].firstedge;
G.adjList[j].firstedge = e;
}
}
/*-----------------------------------------------*/
// DFS
bool visit[MAXVEX]; // 用于标记顶点是否已被遍历
void DFS(GraphAdjList GL, int i) // DFS搜索
{
EdgeNode *p;
visit[i] = true; // 当前顶点标记为 已遍历
cout<<GL.adjList[i].data<<ends; // 输出顶点信息(可改为其他操作)
p = GL.adjList[i].firstedge; // 指向当前邻接顶点 指向的子结点
while(p)
{
if(!visit[p->adjvex]) // 遍历与当前邻接顶点有联系的 其他顶点
DFS(GL,p->adjvex);
p = p->next; // 继续遍历下一个子结点
}
}
void DFSTraverse(GraphAdjList GL)
{
int i;
for(i=0;i<GL.numVertexes;i++) // 初始化标记数组为 未遍历
visit[i] = false;
for(i=0;i<GL.numVertexes;i++) // 对每一个没有遍历过的顶点进行DFS
if(!visit[i])
DFS(GL,i);
}
int main()
{
GraphAdjList G;
CreateALGraph(G);
DFSTraverse(G);
return 0;
}