最小生成樹問題

2021-07-12 02:02:17 字數 1155 閱讀 8907

1.構造可以使n個城市連線的最小生成樹。問題描述:給定乙個地區的n個城市間的距離網,用prim演算法或kruskal演算法建立最小生成樹,並計算得到的最小生成樹的代價。(4)

要求:1)城市間的距離網採用鄰接矩陣表示,鄰接矩陣的儲存結構定義採用課本中給出的定義,若兩個城市之間不存在道路,則將相應邊的權值設為自己定義的無窮大值.要求在螢幕上顯示得到的最小生成樹中包括了哪些城市間的道路,並顯示得到的最小生成樹的代價。

2)表示城市間距離網的鄰接矩陣(要求至少6個城市,10條邊);

3)最小生成樹中包括的邊及其權值,並顯示得到的最小生成樹的代價。

#include #include #include #define  max 20

#define max_lnt 10

typedef struct node /*構造乙個結構體,兩個城市可以看成起點和終點,之間的道路可以看成乙個邊*/

node;

node p[max],temp; /*p記錄城市資訊*/

int pre[100],rank[100];/*用於判斷是否構成迴路*/

int n=0,arcs[max_lnt][max_lnt];/*n表示城市個數,arcs記錄城市間權值*/

int menu( ) /*選單函式*/

/*下面三個函式作用是檢驗當一條邊新增進去,是否會產生迴路*/

void set(int x)/*初始化*/

int find(int x)/*找到這個點的祖先*/

void union(int x,int y)/*將這兩個新增到乙個集合裡去*/

else pre[y] = x;

}void kruskal( ) //克魯斯卡爾

}for(i=1;i<=k;i++) /*把所有的邊按從小到大進行排序*/

}for(j = 2;j <= n;j ++)

}ans += arcs[close[k]][k];

} if(ans >= 100000000) printf("不能構成最小生成樹\n");

else printf("能構成最小生成樹\n");

}int main( ) /*主函式*/

} return 0;

}

最小生成樹問題

最小生成樹 是一棵樹 無迴路 個頂點一定有 條邊 包含全部頂點 條邊都在圖里 邊的權重和最小 生成約束 只能用圖里有的邊 只能正好用掉 條邊 不能有迴路 主要演算法 prim演算法 讓樹長大 int prim int n int ans 0 距離權值總和 vis 1 true 生成樹的根 起點 標記...

最小生成樹問題

最小生成樹 乙個有n個點的圖,邊一定是大於等於n 1條的。圖的最小生成樹,就是在這些邊中選擇n 1條出來,連線所有的n個點。這n 1條邊的邊權之和是所有方案中最小的。最小生成樹用來解決什麼問題?就是用來解決如何用最小的 代價 用n 1條邊連線n個點的問題。例題 洛谷p3366 乾坤大挪移 最小生成樹...

最小生成樹問題

最小生成樹問題一般對應無向圖,一般都有m n n,所以mlogm和mlogn差不多,所以我們一般用kruskal而不常用堆優化的prim 1.樸素版primo n2 基本思路 初始化 dis i 正無窮大 for i 0 i n次迭代,因為要加入n個點到集合中 t 找到集合外距離最近的點 用 t 更...