//深度优先搜索算法
#include<stdio.h>
#define MAX 30
typedef enum{DG,DN,UDG,UDN} Graphkind;
typedef struct arccell //定义表示弧的邻接矩阵
{
int adj;
int *info; //弧的相关信息
}arccell,adjmatrix[MAX][MAX];
typedef struct //定义一个图类型
{
int vexs[MAX];
adjmatrix arcs;
int vexnum,arcnum;
Graphkind kind;
}mgraph;
int visited[MAX]; //标志数组
//找出值为v的顶点在图的存储数组中的索引
int locatevex(mgraph g,int v)
{
for(int i=0;i<g.vexnum;++i)
if(g.vexs[i]==v)return i;
}
int createUDG(mgraph &G) //构造无向图
{
int i,j,k;
int v1,v2;
printf("输入无向图的顶点个数和边的个数:/n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入无向图的各顶点的值:/n");
for(i=0;i<G.vexnum;++i)
scanf("%d",&G.vexs[i]);
for(i=0;i<G.vexnum;++i)
for(j=0;j<G.vexnum;++j)
{G.arcs[i][j].adj=0;G.arcs[i][j].info=0;}
for(k=0;k<G.arcnum;++k)
{
printf("输入无向图边的两个关联顶点:/n");
scanf("%d%d",&v1,&v2);
i=locatevex(G,v1);
j=locatevex(G,v2);
G.arcs[i][j].adj=1;
G.arcs[i][j]=G.arcs[j][i];
}
return 1;
}
int createDG(mgraph &G) //构造有向图
{
int i,j,k;
int v1,v2;
printf("输入无向图的顶点个数和边的个数:/n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入无向图的各顶点的值:/n");
for(i=0;i<G.vexnum;++i)
scanf("%d",&G.vexs[i]);
for(i=0;i<G.vexnum;++i)
for(j=0;j<G.vexnum;++j)
{G.arcs[i][j].adj=0;G.arcs[i][j].info=0;}
for(k=0;k<G.arcnum;++k)
{
printf("输入有向图边的两个关联顶点:/n");
scanf("%d%d",&v1,&v2);
i=locatevex(G,v1);
j=locatevex(G,v2);
G.arcs[i][j].adj=1;
}
return 1;
}
int createUDN(mgraph &G) //构造无向网
{
int i,j,k;
int v1,v2,w;
printf("输入无向网的顶点个数和边的个数:/n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入无向网的各顶点的值:/n");
for(i=0;i<G.vexnum;++i)
scanf("%d",&G.vexs[i]);
for(i=0;i<G.vexnum;++i)
for(j=0;j<G.vexnum;++j)
{G.arcs[i][j].adj=0;G.arcs[i][j].info=0;}
for(k=0;k<G.arcnum;++k)
{
printf("输入无向网边的两个关联顶点和边的权值:/n");
scanf("%d%d%d",&v1,&v2,&w);
i=locatevex(G,v1);
j=locatevex(G,v2);
G.arcs[i][j].adj=w;
G.arcs[i][j]=G.arcs[j][i];
}
return 1;
}
int createDN(mgraph &G) //构造有向网
{
int i,j,k;
int v1,v2,w;
printf("输入有向网的顶点个数和边的个数:/n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入有向网的各顶点的值:/n");
for(i=0;i<G.vexnum;++i)
scanf("%d",&G.vexs[i]);
for(i=0;i<G.vexnum;++i)
for(j=0;j<G.vexnum;++j)
{G.arcs[i][j].adj=0;G.arcs[i][j].info=0;}
for(k=0;k<G.arcnum;++k)
{
printf("输入无向网边的两个关联顶点和边的权值:/n");
scanf("%d%d%d",&v1,&v2,&w);
i=locatevex(G,v1);
j=locatevex(G,v2);
G.arcs[i][j].adj=w;
}
return 1;
}
int creategraph(mgraph &G)
{
int n;
printf("DG:0 DN:1 UDG:2 UDN:3/n");
scanf("%d",&n);
switch(n)
{
case 0:return createDG(G);
case 1:return createDN(G);
case 2:return createUDG(G);
case 3:return createUDN(G);
default :return 0;
}
}
void DFS(mgraph g,int i)
{
printf("深度优先访问%d/n",g.vexs[i]); //访问结点
visited[i]=1; //标记已访问的结点
for(int j=0;j<g.vexnum;++j)
if(g.arcs[i][j].adj==1&&visited[i]!=1)
DFS(g,j);
}
void DFSTraverse(mgraph g)
{
int i;
for(i=0;i<g.vexnum;++i) //初始化标志数组的值都为0
visited[i]=0;
for(i=0;i<g.vexnum;++i)
if(!visited[i])
DFS(g,i);
}
void print(mgraph &g)
{
int i,j;
for(i=0;i<g.vexnum;++i)
printf("%d ",g.vexs[i]);
printf("/n");
for(i=0;i<g.vexnum;++i)
{
for(j=0;j<g.vexnum;++j)
printf("%d ",g.arcs[i][j].adj);
printf("/n");
}
}
void main()
{
mgraph g1;
creategraph(g1);
print(g1);
DFSTraverse(g1);
}