標籤:鄰接矩陣 span 鄰接 oid 遍曆 == 編號 else 表示
一個無向連通圖G點上的哈密爾頓(Hamiltion)迴路是指從圖G上的某個頂點出發,經過圖上所有其他頂點一次且僅一次,最後回到該頂點的路勁。一種求解無向圖上哈密爾頓迴路演算法的基礎私下如下:
假設圖G存在一個從頂點V0出發的哈密爾頓迴路V1——V2——V3——...——Vn-1——V0。演算法從頂點V0出發,訪問該頂點的一個未被訪問的鄰接頂點V1,接著從頂點V1出發,訪問V1一個未被訪問的鄰接頂點V2,..。;對頂點Vi,重複進行以下操作:訪問Vi的一個未被訪問的鄰接接點Vi+1;若Vi的所有鄰接頂點均已被訪問,則返回到頂點Vi-1,考慮Vi-1的下一個未被訪問的鄰接頂點,仍記為Vi;知道找到一條哈密爾頓迴路或者找不到哈密爾頓迴路,演算法結束。
【C代碼】
下面是演算法的C語言實現。
(1)常量和變數說明
n :圖G中的頂點數
c[][]:圖G的鄰接矩陣
k:統計變數,當期已經訪問的定點數為k+1
x[k]:第k個訪問的頂點編號,從0開始
visited[x[k]]:第k個頂點的訪問標誌,0表示未訪問,1表示已訪問
(2)C程式
1 #include <stido.h> 2 #include <stidb.h> 3 #define MAX 100 4 5 void Hamilton(int n,int x[MAX,int c[MAX][MAX]){ 6 in t ; 7 in t visited[MAX]; 8 int k; 9 /*初始化x數組賀visited數組*/10 for(i=0:i<n;i++){11 x[i]=0;12 visited [i]=0;13 }14 /*訪問起始頂點*/15 k=0;16 (visited[0]=1);17 x[0]=0;18 k=k+1;19 /*訪問其他頂點*/20 while(k>=0){21 x[k]=x[k]+1;22 while(x[k]><n){23 if(visited[x[k]]==0) &&c[x-[k-1]][x[k]=1){/*鄰接頂點x[k]未被訪問過*/24 break;25 }else{26 x[k] = x[k] +1;27 }28 }29 if(x[k] <n-1&&(visited[x[k]]==1){ /*找到一條哈密爾頓迴路*/30 for(k=0;k<n;k++){31 prinf(〝%d--〝,x[k] ; /*輸出哈密爾頓迴路*/32 }33 prinf(〝%d--〝,x[0] ;34 return;35 }else if x[k]<n&&k<n-1){/*設定當期頂點的訪問標誌,繼續下一個頂點*/36 (visited[x[k]]=1);37 k=k+1;38 }else{/*沒有未被訪問過的鄰接頂點,回退到上一個頂點*/39 x[k]=0;40 visited x[k]=0;41 (k=k-1);42 }43 }44 }
【問題1】(10分)
根據題幹說明。填充C代碼中的空(1)~(5).
答案:代碼中標註紅色的即為答案!
【問題2】(5分)
根據題幹說明和C代碼,演算法採用的設計策略為(6),該方法在遍曆圖的頂點時,採用的是(7)方法(深度優先或廣度優先)。
答案:
6:回溯法
7:深度優先
C語言程式試題-01