日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构实验之图论九:最小生成树(Prim/Kruskal)

發(fā)布時間:2025/3/21 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构实验之图论九:最小生成树(Prim/Kruskal) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Description

有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現(xiàn)在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發(fā),可以到達其他任意的城市。

Input

輸入包含多組數(shù)據(jù),格式如下。
第一行包括兩個整數(shù)n m,代表城市個數(shù)和可以修建的公路個數(shù)。(n <= 100, m <=10000)
剩下m行每行3個非負整數(shù)a b c,代表城市a 和城市b之間可以修建一條公路,代價為c(城市編號從1到n)。

Output

每組輸出占一行,僅輸出最小花費。
Sample
Input

3 2 1 2 1 1 3 1 1 0

Output

2
0

//Prim #include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3fconst int N = 200;int mp[N][N]; int book[N];int Prim(int n) {int dist[N];int sum = 0;//最終花費for(int i = 1; i <= n; i++){dist[i] = mp[1][i];//dist數(shù)組表示從1這個點開始,到其余各點的權值}book[1] = 1;//1這個點在開始時加入最小生成樹,不進入接下來的循環(huán)int minn, u;for(int i = 1; i < n; i++){minn = INF;u = 0;for(int j = 1; j <= n; j++){if(!book[j] && dist[j] < minn)//找到生成樹的下一個點{minn = dist[j];u = j;}}book[u] = 1;sum += minn;for(int v = 1; v <= n; v++)//在加入u這個新點之后更新dist數(shù)組的值{if(!book[v] && dist[v] > mp[u][v]){dist[v] = mp[u][v];}}}return sum; } int main() {int n, m, u, v, len;while(cin >> n >> m){memset(book, 0, sizeof(book));memset(mp, INF, sizeof(mp));for(int i = 1; i <= n; i++){mp[i][i] = 0;}while(m--){cin >> u >> v >> len;if(len < mp[u][v])//這個非常重要mp[u][v] = mp[v][u] = len;}cout << Prim(n) << endl;} } //Kruskal #include<bits/stdc++.h>using namespace std;const int N = 110, M = 1e4 + 10; int Next[N];struct node {int u, v, len; } edge[M]; int cmp(node a, node b) {return a.len < b.len; }void init(int n)//并查集初始化 {for(int i = 1; i <= n; i++)Next[i] = i; } int find_root(int i)//查找根節(jié)點 {if(Next[i] == i)return Next[i];else{Next[i] = find_root(Next[i]);return Next[i];} } int merage(int u, int v) {int t1 = find_root(u), t2 = find_root(v);if(t1 != t2){Next[t1] = Next[t2];return 1;}elsereturn 0; } int main() {int n, m;while(cin >> n >> m){int sum = 0;init(n);for(int i = 1; i <= m; i++)cin >> edge[i].u >> edge[i].v >> edge[i].len;sort(edge + 1, edge + 1 + m, cmp);for(int i = 1; i <= m; i++){if(merage(edge[i].u, edge[i].v))sum += edge[i].len;}cout << sum << endl;}return 0; }

總結

以上是生活随笔為你收集整理的数据结构实验之图论九:最小生成树(Prim/Kruskal)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。