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



問題及代碼:

/*     
*煙臺大學計算機與控制工程學院      
*作    者:孫麗瑋    
*完成日期:2016年11月17日  
*問題描述:假設圖G採用鄰接表存儲,分別設計實現以下要求的算法,要求用區別於示例中的圖進行多次測試,通過觀察輸出值,掌握相關問題的處理方法。 
        (1)設計一個算法,判斷頂點u到v是否有簡單路徑 
        (2)設計一個算法輸出圖G中從頂點u到v的一條簡單路徑(設計測試圖時,保證圖G中從頂點u到v至少有一條簡單路徑)。 
        (3)輸出從頂點u到v的所有簡單路徑。 
        (4)輸出圖G中從頂點u到v的長度爲s的所有簡單路徑。 
        (5)求圖中通過某頂點k的所有簡單迴路(若存在)
*/ 


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

#include <stdio.h>
#include <malloc.h>
#include "graph.h"
int visited[MAXV];       //全局變量

void DFSPath(ALGraph *G,int u,int v,int path[],int d)
//d是到當前爲止已走過的路徑長度,調用時初值爲-1
{
    int w,i;
    ArcNode *p;
    visited[u]=1;
    d++;
    path[d]=u;
    p=G->adjlist[u].firstarc;   //p指向頂點u的第一條邊
    while (p!=NULL)
    {
        w=p->adjvex;            //w爲頂點u的相鄰點
        if (w==v && d>0)        //找到一個迴路,輸出之
        {
            printf("  ");
            for (i=0; i<=d; i++)
                printf("%d ",path[i]);
            printf("%d \n",v);
        }
        if (visited[w]==0)          //w未訪問,則遞歸訪問之
            DFSPath(G,w,v,path,d);
        p=p->nextarc;       //找u的下一個鄰接頂點
    }
    visited[u]=0;           //恢復環境:使該頂點可重新使用
}

void FindCyclePath(ALGraph *G,int k)
//輸出經過頂點k的所有迴路
{
    int path[MAXV],i;
    for (i=0; i<G->n; i++)
        visited[i]=0; //訪問標誌數組初始化
    printf("經過頂點%d的所有迴路\n",k);
    DFSPath(G,k,k,path,-1);
    printf("\n");
}

int main()
{
    ALGraph *G;
    int A[5][5]=
    {
        {0,1,1,0,0},
        {0,0,1,0,0},
        {0,0,0,1,1},
        {0,0,0,0,1},
        {1,0,0,0,0}
    };  //請畫出對應的有向圖
    ArrayToList(A[0], 5, G);
    FindCyclePath(G, 0);
    return 0;
}


運行結果:


總結:

簡單迴路即路徑上的頂點不重複,但第一個頂點與最後一個頂點重複的迴路。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章