#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
typedef char TypeData;
#define MAXVEX 100
#define INFINITY 65535
int visited[MAXVEX]={0};
int stack[MAXVEX];
queue<int> q;
typedef struct stGraph
{
TypeData vexs[MAXVEX];//存放圖中頂點的數組
int arc[MAXVEX][MAXVEX];//鄰接矩陣
int VNum,ENum;//頂點數、邊數
}MGraph;
void CreatMGraph(MGraph *G);
void DFSTraverse(MGraph *G);
void BFSTraverse(MGraph *G);
void CreatMGraph(MGraph *G)
{
int i=0,j=0,k=0,w=0;
cout<<"請輸入頂點數和邊數:"<<endl;
cin>>G->VNum>>G->ENum;
cout<<"請輸入圖的頂點:";
for(i=0;i<G->VNum;i++)
{
cin>>G->vexs[i];
}
for(i=0;i<G->VNum;i++)
for(j=0;j<G->VNum;j++)
{
G->arc[i][j]=INFINITY;
}
for(k=0;k<G->ENum;k++)
{
cout<<"請輸入(vi,vj)上的下標,i,j,和權值w:"<<endl;
cin>>i>>j>>w;
G->arc[i][j]=w;
G->arc[j][i]=w;
}
}
void DFSTraverse(MGraph *G,int v)
{
int top=-1;
int j;
cout<<G->vexs[v]<<" "; visited[v]=1;
stack[++top]=v;
while(top!=-1)
{
v=stack[top];
for(j=0;j<G->VNum;j++)
if(G->arc[v][j]!=INFINITY&&visited[j]==0){
cout<<G->vexs[j]<<" ";
visited[j]=1;
stack[++top]=j;
break;
}
if(j==G->VNum) top--;
}
}
void BFSTraverse(MGraph *G)
{
int i,j;
for(i=0;i<G->VNum;i++) visited[i]=0;
queue<int> q;
for(i=0;i<G->VNum;i++)
{
if(visited[i]==0)
{
cout<<G->vexs[i]<<" ";
visited[i]=1;
q.push(i);
while(!q.empty())
{
i=q.front();
q.pop();
for(j=0;j<G->VNum;j++)
if(G->arc[i][j]!=INFINITY&&visited[j]==0){
cout<<G->vexs[j]<<" ";
visited[j]=1;
j=q.front();
}
}
}
}
}
int main()
{
MGraph *G=new MGraph;
int v;
CreatMGraph(G);
cout<<"請輸入要作爲源點的頂點的下標值:"<<endl;
cin>>v;
cout<<"該圖的深度優先遍歷順序爲:"<<endl;
DFSTraverse(G,v);
cout<<endl;
cout<<"該圖的廣度優先遍歷順序爲:"<<endl;
BFSTraverse(G);
return 0;
}
圖的遍歷(鄰接矩陣的非遞歸實現)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.