/*
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。重複以下步驟,直到所...