第十二週項目四 利用遍歷思想求解圖問題(6、7)

問題及代碼:

/*     
*煙臺大學計算機與控制工程學院      
*作    者:孫麗瑋    
*完成日期:2016年11月17日  
*問題描述:假設圖G採用鄰接表存儲,分別設計實現以下要求的算法,要求用區別於示例中的圖進行多次測試,通過觀察輸出值,掌握相關問題的處理方法。 
        (6)求不帶權連通圖G中從頂點u到頂點v的一條最短路徑。 
        (7)求不帶權連通圖G中,距離頂點v最遠的頂點k 
*/ 

1、graph.h的代碼(見圖基本算法庫)
2、graph.cpp的代碼(見圖基本算法庫)

3、main.cpp的代碼

#include <stdio.h>
#include <malloc.h>
#include "graph.h"

typedef struct
{
    int data;                   //頂點編號
    int parent;                 //前一個頂點的位置
} QUERE;                        //非環形隊列類型

void ShortPath(ALGraph *G,int u,int v)
{
    //輸出從頂點u到頂點v的最短逆路徑
    ArcNode *p;
    int w,i;
    QUERE qu[MAXV];             //非環形隊列
    int front=-1,rear=-1;       //隊列的頭、尾指針
    int visited[MAXV];
    for (i=0; i<G->n; i++)      //訪問標記置初值0
        visited[i]=0;
    rear++;                     //頂點u進隊
    qu[rear].data=u;
    qu[rear].parent=-1;
    visited[u]=1;
    while (front!=rear)         //隊不空循環
    {
        front++;                //出隊頂點w
        w=qu[front].data;
        if (w==v)               //找到v時輸出路徑之逆並退出
        {
            i=front;            //通過隊列輸出逆路徑
            while (qu[i].parent!=-1)
            {
                printf("%2d ",qu[i].data);
                i=qu[i].parent;
            }
            printf("%2d\n",qu[i].data);
            break;
        }
        p=G->adjlist[w].firstarc;   //找w的第一個鄰接點
        while (p!=NULL)
        {
            if (visited[p->adjvex]==0)
            {
                visited[p->adjvex]=1;
                rear++;             //將w的未訪問過的鄰接點進隊
                qu[rear].data=p->adjvex;
                qu[rear].parent=front;
            }
            p=p->nextarc;           //找w的下一個鄰接點
        }
    }
}

int Maxdist(ALGraph *G,int v)
{
    ArcNode *p;
    int i,j,k;
    int Qu[MAXV];               //環形隊列
    int visited[MAXV];              //訪問標記數組
    int front=0,rear=0;             //隊列的頭、尾指針
    for (i=0; i<G->n; i++)          //初始化訪問標誌數組
        visited[i]=0;
    rear++;
    Qu[rear]=v;                 //頂點v進隊
    visited[v]=1;               //標記v已訪問
    while (rear!=front)
    {
        front=(front+1)%MAXV;
        k=Qu[front];                //頂點k出隊
        p=G->adjlist[k].firstarc;       //找第一個鄰接點
        while (p!=NULL)             //所有未訪問過的相鄰點進隊
        {
            j=p->adjvex;            //鄰接點爲頂點j
            if (visited[j]==0)          //若j未訪問過
            {
                visited[j]=1;
                rear=(rear+1)%MAXV;
                Qu[rear]=j; //進隊
            }
            p=p->nextarc;           //找下一個鄰接點
        }
    }
    return k;
}

int main()
{
    ALGraph *G;
    int A[9][9]=
    {
        {0,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,0,0,0,0},
        {0,0,0,0,1,1,0,0,0},
        {0,0,0,0,0,0,1,0,0},
        {0,0,0,0,0,1,1,0,0},
        {0,0,0,0,0,0,0,1,0},
        {0,0,0,0,0,0,0,1,1},
        {0,0,0,0,0,0,0,0,1},
        {0,0,0,0,0,0,0,0,0}
    };  //請畫出對應的有向圖
    ArrayToList(A[0], 9, G);
    ShortPath(G,0,7);
	printf("離頂點0最遠的頂點:%d\n",Maxdist(G,0));
    return 0;
}

運行結果:


總結:

最短路徑即求從u到v的經過邊數最少的頂點序列。由於要用隊列找出路徑,採用非環形隊列。

求最遠頂點不需求路徑,採用隊列可以是環形隊列。

發佈了93 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章