建立无向图的不带权值的邻接矩阵,深度遍历简单路径
# include <iostream.h>
# include <stdio.h>
# include<string.h>
#define TRUE 1
#define FALSE 0
#define INFINITY INT_MAX /*最大值“无穷”*/
#define MAX_VERTEX_NUM 20 /*最大顶点个数*/
typedef int Boolean;
typedef char VertexType[20];
typedef int VRType,InfoType;
typedef struct ArcCell//定义无权值无向图
{
VRTypeadj; /*图中有1/0表示是否有边,网中表示边上的权值*/
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexTypevexs[MAX_VERTEX_NUM];/*顶点向量*/
AdjMatrixarcs;/*邻接矩阵*/
intvexnum,arcnum; /*图中当前顶点数和边数*/
}MGraph;
int LocateVertex(MGraph G,VertexType v)/* 顶点在顶点向量中的定位*/
{
inti=0;
while((strcmp(v,G.vexs[i])!=0))
i++;
returni;
}
void GetArc(VertexType u,VertexType v)//输入一条弧<u,v>
{
cout<<"请输入一条弧:";
cin>>u>>v;
}
void CreateGraph(MGraph *&G)/*建立无向图的邻接矩阵*/
{
inti,j,k; //i,j,k为计数器
VertexTypev1,v2; //用于放置输入的弧的两个顶点
printf("请输入无向图G的顶点数,边数: \n");
cin>>G->vexnum>>G->arcnum;
cout<<endl;
cout<<"请输入"<<G->vexnum<<"个顶点的值(1个字符,空格隔开)"<<endl;
for(i=0;i<G->vexnum;i++)// 构造顶点向量
{
cin>>G->vexs[i];
}
for(i=0;i<G->vexnum;i++)// 初始化邻接矩阵
for(j=0;j<G->vexnum;j++)
{
G->arcs[i][j].adj=0;
}
cout<<"请输入"<<G->arcnum<<"条边(以空格作为间隔)"<<endl;
for(k=0;k<G->arcnum;k++)
{
GetArc(v1,v2);//每次输入一条弧
i=LocateVertex(*G,v1);
j=LocateVertex(*G,v2);
G->arcs[j][i].adj=1;
G->arcs[i][j].adj=G->arcs[j][i].adj;// 置<v1,v2>的对称弧<v2,v1>
}
}
void PrintGraph(MGraph *G)
{
inti,j;
cout<<"MGraph"<<endl;
for(i=0;i<G->vexnum;i++)
{
cout<<G->vexs[i];
for(j=0;j<G->vexnum;j++)
{
cout<<G->arcs[i][j].adj<<"";
}cout<<endl;
}
}
int FirstAdj(MGraph *&G,int v)/* 查找第1个邻接点 */
{
intj;
intp=-1;
for(j=0;j<G->vexnum;j++)
if(G->arcs[v][j].adj)
{p=j;break;
}
returnp;
}
int NextAdj(MGraph *&G,int v,int w)/* 查找下一个邻接点 */
{
intj;
intp=-1;
for(j=w+1;j<G->vexnum;j++)
if(G->arcs[v][j].adj)
{
p=j;break;
}
returnp;
}
Boolean visited[MAX_VERTEX_NUM];
void DFS(MGraph *&G,int v)
{
intw;
visited[v]=TRUE;
cout<<G->vexs[v];
for(w=FirstAdj(G,v);w>=0;w=NextAdj(G,v,w))
{
if(visited[w]==0)
DFS(G,w);
}
}
void DFSTraverse(MGraph *&G)
{
intv;
for(v=0;v<G->vexnum;v++)
visited[v]=FALSE;
for(v=0;v<G->vexnum;v++)
if(visited[v]==0)
DFS(G,v);
}
void main()
{
MGraph*G=new MGraph;
CreateGraph(G);
PrintGraph(G);
cout<<"G的简单路径为:";
DFSTraverse(G);
cout<<endl;
}