#include<stdio.h>
#include<stdlib.h>
#define Max_vex 20
int visited[Max_vex];//记录每个顶点被访问的情况
typedef struct{
int adj;
}arcCell,adjMatrix[Max_vex][Max_vex];
typedef struct{
int vex[Max_vex];
adjMatrix adj;
int vexNum,arcNum;
}Mgraph;
int LocateVex(Mgraph *G,int v)//根据顶点的数据找到顶点在数组中的位置下标
{
int i=0;
for(;ivexNum;i++)
{
if(G->vex[i]v)
break;
}
if(i>G->vexNum)
{
printf(“no such vextex\n”);
return -1;
}
return i;
}
void CreateDN(Mgraph *G)
{
scanf("%d,%d",&(G->vexNum),&(G->arcNum));
for(int i=0;ivexNum;i++)
{
//fflush(stdin);
scanf("%d",&(G->vex[i]));
}
for(int j=0;jvexNum;j++)
{
for(int k=0;kvexNum;k++)
{
G->adj[j][k].adj=0;//初始化邻接表
}
}
for(i=0;iarcNum;i++)
{
int v1,v2;
scanf("%d,%d",&v1,&v2);
int n=LocateVex(G,v1);
int m=LocateVex(G,v2);
if(n-1||m==-1)
{
printf(“no such vertex\n”);
return;
}
G->adj[n][m].adj=1;
G->adj[m][n].adj=1;
}
}
int FirstAdjVex(Mgraph G,int v)//找到顶点V(下标)的第一个邻接顶点的下标
{
for(int i=0;i<G.vexNum;i++)
{
if(G.adj[v][i].adj)
{
return i;
}
}
return -1;
}
int NextAdjVex(Mgraph G,int v,int w)//从前一个访问位置w的下一个位置开始,查找与顶点V有边的顶点
{
for(int i=w+1;i<G.vexNum;i++)
{
if(G.adj[v][i].adj)
{
return i;
}
}
return -1;
}
void visitVex(Mgraph G,int v)
{
printf("%d ",G.vex[v]);
}
void DFS(Mgraph G,int v)
{
visited[v]=1;
visitVex(G,v);
for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
{
if(!visited[w])
{
DFS(G,w);
}
}
}
void DFSTraverse(Mgraph G)
{
for(int i=0;i<G.vexNum;i++)
{
visited[i]=0;
}
for(i=0;i<G.vexNum;i++)
{
if(!visited[i])
{
DFS(G,i);
}
}
}
int main()
{
Mgraph G;
CreateDN(&G);
DFSTraverse(G);
return 0;
}
图的深度优先搜索
最新推荐文章于 2024-03-21 09:40:13 发布