著名的「漢密爾頓(hamilton)迴路問題」是要找乙個能遍歷圖中所有頂點的簡單迴路(即每個頂點只訪問 1 次)。本題就要求你判斷任一給定的迴路是否漢密爾頓迴路。
輸入格式:
首先第一行給出兩個正整數:無向圖中頂點數 n(21 v2 ⋯ vn
其中 n 是迴路中的頂點數,vi是路徑上的頂點編號。
輸出格式:
對每條待檢迴路,如果是漢密爾頓迴路,就在一行中輸出"yes",否則輸出"no"。
輸入樣例:
6 106 23 4
1 52 5
3 14 1
1 66 3
1 24 5
67 5 1 4 3 6 2 5
6 5 1 4 3 6 2
9 6 2 1 6 3 4 5 2 6
4 1 2 5 1
7 6 1 3 4 5 2 6
7 6 1 2 5 4 3 1
輸出樣例:
yesnono
noyes
no
思路
根據hamilton迴路的特點,乙個迴路要是hamilton迴路需要具備以下特點:
它是個迴路,即起始點和終止點需要相等。
它遍歷了圖上所有的點,且各點只訪問一次。
它中間走過的路徑是存在的。
根據以上特點,具體可以這樣操作:
用乙個鄰接矩陣的結構來儲存圖的資訊
對於需要判定的迴路,首先判斷其輸入的點是否為graph->nv+1,如果不是,直接輸出no,如果是則讀取。
用乙個inputarr陣列儲存輸入的點,用visited陣列來標記陣列角標對應編號的頂點是否訪問。在這一步讀入的時候,可以直接去判斷輸入迴路是否滿足條件1,當然也可以放在下面的步驟判斷。
每次都用inputarr陣列相鄰兩個元素判斷,看這兩個元素是否有邊相連,一旦沒有,輸出no。有的話,把inputarr陣列中後乙個元素的visited標記置為1.
完成後檢查visited的標記是否全為1,如果不全為1就說明不滿足條件2,輸出no。
實現
#include
#include
#define maxn 200
#define infinity 100000
typedef
int weighttype;
typedef
int vertex;
typedef
struct gnode *ptrtognode;
typedef ptrtognode mgraph;
struct gnode
;typedef
struct enode *ptrtoenode;
typedef ptrtoenode edge;
struct enode
;mgraph creategraph
(int vertexnum)
void
insertedge
(mgraph graph, edge e)
mgraph buildgraph
(int vertexnum,
int edgenum)
return graph;
}int
isedge
(mgraph graph, vertex v1, vertex v2)
intmain()
;int visited[maxn]=;
scanf
("%d %d"
,&n,
&m);
mgraph graph =
buildgraph
(n, m)
;scanf
("%d"
,&k)
;for
(i=0
; ielse
//for
(j=0
; jnv+
1; j++
)for
(j=0
; jnv; j++)}
if(j == graph->nv)}if
(j == graph->nv)
printf
("yes\n");
}}}return0;
}
pta資料結構
是否二叉搜尋樹 這題只要是了解二叉查詢樹的特點。bool isbst bintree t while right1 return isbst t left isbst t right 線性探測法的查詢函式 主要注意雜湊函式,這裡那個常量是真的坑,卡了半天。position find hashtabl...
資料結構PTA 基礎實驗6 2 1 列出連通集
給定乙個有n個頂點和e條邊的無向圖,請用dfs和bfs分別列出其所有的連通集。假設頂點從0到n 1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。輸入格式 輸入第1行給出2個整數n 0輸出格式 按照 的格式,每行輸出乙個連通集。先輸出dfs的結果,再輸出bfs的結果。...
PTA資料結構單選
最近學習資料結構鍊錶,被每週作業題所困。現做題解,以此共勉。析 不帶頭節點的單向鍊錶,一定具有頭指標,且在這兒以頭指標冠以鍊錶名。頭指標指向第乙個節點的儲存位置。向空鍊錶插入元素,則讓該插入元素的鏈結位址為h 第乙個節點的位置 再使頭指標h指向該元素。析 頭節點 位於首節點之前,為空,則鏈結位址為n...