Prime演算法求最小生成樹 鄰接表)

2021-06-27 06:52:15 字數 4468 閱讀 9129

/*

name: prime演算法求最小生成樹 (鄰接表)

author: 巧若拙 

date: 25/11/14 13:38

description: 

實現了 prime演算法求最小生成樹 (鄰接表)的普通演算法和最小堆優化演算法。 

*/#include

#include

#define max 2000   //最大頂點數量 

#define infinity 999999   //無窮大 

typedef int vertextype; //頂點型別由使用者自定義

typedef int edgetype; //邊上的權值型別由使用者自定義

typedef struct edgenode edgenode;

typedef struct vertexnode vertexnode;

typedef struct minheap minheap; //最小堆結構體  

int map[max][max] = ;//鄰接矩陣儲存圖資訊 

int locate(vertexnode *gl, int u, int v);//判斷u,v是否是鄰接點 

void creategraph(vertexnode *gl, int n, int m);//建立鄰接表圖(人工圖) 

void creategraph_2(vertexnode *gl, int n, int m);//建立鄰接表圖(隨機圖) 

void printgraph(vertexnode *gl, int n);//輸出圖

void destroygl(vertexnode *gl, int n);//銷毀圖並釋放空間 

void prime(vertexnode *gl, int n, int v0);//prime演算法求最小生成樹(原始版本) 

void prime_minheap(vertexnode *gl, int n, int v0);//prime演算法求最小生成樹(優先佇列版本) 

void buildminheap(minheap que, int n);

void minheapsiftdown(minheap que, int n, int pos);

void minheapsiftup(minheap que, int n, int pos);

void changekey(minheap que, int pos, int weight);//將第pos個元素的關鍵字值改為weight 

int searchkey(minheap que, int pos, int weight);//查詢最小堆中關鍵字值為k的元素下標,未找到則返回-1(非遞迴) 

int extractmin(minheap que);//刪除並返回最小堆中具有最小關鍵字的元素

int main()

void creategraph(vertexnode *gl, int n, int m)//建立乙個圖

e->next = gl[v].firstedge;

gl[v].firstedge = e;

e->adjvex = u;

e->weight = w;}} 

void printgraph(vertexnode *gl, int n)//輸出圖

printf("\n");

}printf("\n");

} void creategraph_2(vertexnode *gl, int n, int m)//建立鄰接表圖(隨機圖) 

e->next = gl[0].firstedge;

gl[0].firstedge = e;

e->adjvex = i;

e->weight = w;

e = (edgenode*)malloc(sizeof(edgenode)); //採用頭插法插入邊表結點 

if (!e)

e->next = gl[i].firstedge;

gl[i].firstedge = e;

e->adjvex = 0;

e->weight = w;

} m -= n - 1;

while (m > 0)

e->next = gl[i].firstedge;

gl[i].firstedge = e;

e->adjvex = j;

e->weight = w;

e = (edgenode*)malloc(sizeof(edgenode)); //採用頭插法插入邊表結點 

if (!e)

e->next = gl[j].firstedge;

gl[j].firstedge = e;

e->adjvex = i;

e->weight = w;

m--;

if (m == 0)

return;}} 

}}}} 

int locate(vertexnode *gl, int u, int v)//判斷u,v是否是鄰接點 

return 0;

}void destroygl(vertexnode *gl, int n)

while (e);

gl[i].firstedge = null;}}

void prime(vertexnode *gl, int n, int v0)//prime演算法求最小生成樹(原始版本) 

; //標記該頂點是否已經在路徑中 

int dic[max] = ; //儲存頂點到最小生成樹的距離 

int adj[max] = ; //儲存頂點在最小生成樹樹中的鄰接點序號 

int min, i, j, k;

edgenode *e;

for (i=0; i

dic[v0] = 0;

book[v0] = 1;

for (i=0; i

}book[k] = 1;  

printf("<%d, %d> = %d   ", adj[k], k, dic[k]);

for (e=gl[k].firstedge; e; e=e->next)//更新與頂點k的鄰接點的dic值 }}

min = 0;

for (i=0; i

printf("最小生成樹總長度(權值)為 %d\n", min); 

}void prime_minheap(vertexnode *gl, int n, int v0)//prime演算法求最小生成樹(優先佇列版本) 

; //標記該城市是否已經在路徑中 

int dic[max] = ; //儲存頂點到最小生成樹的距離 

int adj[max] = ; //儲存頂點在最小生成樹樹中的鄰接點序號 

minheap que[max+1];//最小堆用來儲存頂點序號和到最小生成樹的距離 

int min, i, j, k, pos;

edgenode *e;

que[0].num = n; //儲存最小堆中的頂點數量 

for (i=0; i

dic[v0] = 0;

book[v0] = 1;

buildminheap(que, n);//構造乙個最小堆 

for (i=0; i}}

min = 0;

for (i=0; i

printf("最小生成樹總長度(權值)為 %d\n", min); 

}int extractmin(minheap que)//刪除並返回最小堆中具有最小關鍵字的元素

int searchkey(minheap que, int pos, int weight)//查詢最小堆中關鍵字值為k的元素下標,未找到則返回-1(非遞迴) 

;int i = 1, top = -1;

while ((i <= que[0].num && que[i].w <= weight) || top >= 0)//類似先序遍歷二叉樹的方式查詢 

else

}return -1;

}void changekey(minheap que, int pos, int weight)//將第pos個元素的關鍵字值改為weight  

else if (weight > que[pos].w)  //關鍵字值變大,向下調整最小堆   

} void minheapsiftdown(minheap que, int n, int pos)  //向下調整結點 

else  

break;  

}  que[pos] = temp; //將temp向下調整到適當位置   

}  void minheapsiftup(minheap que, int n, int pos)  //向上調整結點 

else  

break;  

}  que[pos] = temp; //將temp向上調整到適當位置   

}  void buildminheap(minheap que, int n)//構造乙個最小堆 

}

最小生成樹 Prime演算法

對於乙個圖,它的所有生成樹中必有乙個 邊的權值最小 的生成樹,我們把它稱為最小生成樹。概念很抽象,換做實際問題 有十個城市,各個城市之間距離或遠或近。需要建設乙個道路網,把十個城市連線在一起,要求道路網的道路長度最小。各個城市的連線可以抽象為乙個圖,本質上即是求該圖的乙個最小生成樹。每乙個圖可能有多...

最小生成樹 prime演算法

問題 c 建立通訊 時間限制 1 sec 記憶體限制 128 mb 提交 7 解決 4 提交 狀態 討論版 題目描述 據不完全統計,受 影響,四川大部分災區通訊陷入癱瘓,數千個基站因斷電 傳輸中斷等原因退出服務,目前總公司已緊急部署對受災地區進行通訊搶修。按照應急通訊保障預案,必須盡快 付出代價最小...

最小生成樹 prime演算法

生成樹頂點集合,初始只含起點 v0。visit i 1 i點已在生成樹中 lowcost i 生成樹中的點 到頂點 i 的最短距離。演算法過程 1.初始化生成樹,一開始只將起點 v0 加入到 樹中。2.初始化 lowcost 陣列,初值為 v0 到各頂點的距離,無邊則為 inf。重複以下步驟,直到所...