1. 程式人生 > >圖的遍歷(鄰接矩陣的非遞迴實現)

圖的遍歷(鄰接矩陣的非遞迴實現)

#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;
}