#include <stdio.h>
#include<queue> ///调用STL队列库函数
#include<stack> ///调用STL栈库函数
#include<string.h>
#define max 20
using namespace std;
int visited[max]={0};
typedef struct Arccell{
int adj;
}Arccell,Adjm[max][max];
typedef struct{
int vexs[max];
Adjm arcs;
int vex,arc;
}Mgraph;
int Locatevex(Mgraph &G,int v)
{
int i,k=-1;
for(i=0;i<G.vex;i++)
if(v==G.vexs[i])
{
k=i;
break;
}
return k;
}
void CreateGraph(Mgraph &G)
{
int i,j,k;
int s;
int v1,v2;
printf ("输入图的顶点数与边数:\n");
scanf("%d%d",&G.vex,&G.arc);
printf("输入顶点信息:\n");
for(i=0;i<G.vex;i++)
{
scanf("%d",&s);
G.vexs[i]=s;
}
for(i=0;i<G.vex;i++) ///初始化邻接矩阵
for(j=0;j<=G.vex;j++)
G.arcs[i][j].adj=0;
printf("输入一边依附的两个顶点:\n");
for(k=0;k<G.arc;k++)
{
scanf("%d%d",&v1,&v2);
i=Locatevex(G,v1);
j=Locatevex(G,v2);
if((i!=-1)&&(j!=-1))
G.arcs[i][j].adj=1;
G.arcs[j][i]=G.arcs[i][j];
}
}
void DFS (Mgraph G,int v)
{
int i;
visited[v]=1;
printf("%d ",G.vexs[v]);
for (i=0;i<G.vex;i++)
if (!visited[i] && G.arcs[v][i].adj)
DFS(G,i);
}
void DFStravel1(Mgraph G)
{///DFS递归遍历
int i;
for (i=0;i<G.vex;i++)
{
if (!visited[i])
DFS(G,i);
}
}
void DFStravel2(Mgraph G,int v)
{///DFS非递归遍历
stack<int>s;
printf("%d ",G.vexs[v]);
visited[v]=1;
s.push(v);
while(!s.empty())
{
int i,j;
i=s.top();
for(j=0;j<G.vex;j++)
{
if(G.arcs[i][j].adj==1 && !visited[j])
{
printf("%d ",G.vexs[j]);
visited[j]=1;
s.push(j);
break;
}
}
if (j==G.vex)
{
s.pop();
}
}
}
void BFStravel(Mgraph G)
{///BFS非递归遍历
int i,j,k;
int v;
queue <int>q;
for(i=0;i<G.vex;i++)
{
if(!visited[i])
{
printf("%d ",G.vexs[i]);
visited[i]=1;
q.push(G.vexs[i]);
while(!q.empty())
{
v=q.front();
q.pop();
k=Locatevex(G,v);
for(j=0;j<G.vex;j++)
{
if(!visited[j] && G.arcs[k][j].adj)
{
visited[j]=1;
printf("%d ",G.vexs[j]);
q.push(G.vexs[j]);
}
}
}
}
}
}
void printGraph(Mgraph &G)
{
int i,j;
for(i=0;i<G.vex;i++)
{
for(j=0;j<G.vex;j++)
printf("%2d",G.arcs[i][j].adj);
printf("\n");
}
}
int main ()
{
Mgraph g;
int i;
CreateGraph (g);
printGraph (g);
printf ("深度优先递归遍历:\n");
DFStravel1 (g);
printf ("\n");
printf ("深度优先非递归遍历:\n");
for(i=0;i<g.vex;i++)
visited[i]=0;
for(i=0;i<g.vex;i++)
{
if (!visited[i])
{
DFStravel2(g,i);
}
}
printf ("\n");
memset (visited,0,sizeof(visited));
printf ("广度优先遍历:\n");
BFStravel(g);
return 0;
}
图的邻接矩阵存储与遍历
最新推荐文章于 2024-05-30 14:38:37 发布