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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU 1863 畅通工程 最小生成树

發布時間:2025/5/22 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 1863 畅通工程 最小生成树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

思路:

  比較典型的最小生成樹的題目了、、在這里用求最小生成樹的經典算法K(Kruskal)算法和P(Prim)算法。我的 K 算法用的是結構體來存圖,P 算法用的是鄰接矩陣來存圖,K算法的復雜度是O(ElogE),比較適用于稀疏圖,P算法的復雜的是O(V ^ 2),適合用稠密圖。

以下是C++的K算法代碼

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <cctype> 7 #include <algorithm> 8 using namespace std; 9 10 const int MAXN = 2e3+ 3; 11 int pre[MAXN]; 12 int m,n; 13 14 int Find(int x) //并查集 15 { 16 return x == pre[x] ? x :(pre[x] = Find(pre[x])); 17 } 18 19 struct Node //存圖 20 { 21 int u, v, w; 22 }cy[103]; 23 24 int mycmp(Node a,Node b) 25 { 26 return a.w < b.w; 27 } 28 29 void mst() 30 { 31 for(int i = 0 ; i < 102; i++) 32 pre[i] = i; 33 } 34 35 int kru()//算法的具體實現 36 { 37 int ans = 0; 38 int cnt = 0; 39 for(int i = 1; i <= n; i++) 40 { 41 int fv = Find(cy[i].v); 42 int fu = Find(cy[i].u); 43 if(fv != fu) 44 { 45 pre[fv] = fu; 46 ans += cy[i].w; 47 cnt ++; 48 } 49 if(cnt == m -1) 50 { 51 return ans; 52 break; 53 } 54 } 55 return -1; 56 } 57 58 int main() 59 { 60 //freopen("in.cpp","r",stdin); 61 while(~scanf("%d%d",&n,&m) && n) 62 { 63 mst(); 64 for(int i = 1; i <= n; i++) 65 scanf("%d%d%d",&cy[i].u, &cy[i].v, &cy[i].w); 66 sort(cy + 1, cy + n + 1, mycmp); 67 int ans = kru(); 68 if(ans != -1) 69 printf("%d\n",ans); 70 else 71 printf("?\n"); 72 } 73 return 0; 74 }

?



以下是C++的P算法代碼

?

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <cctype> 7 #include <algorithm> 8 using namespace std; 9 10 const int MAXN = 103; 11 const int INF = 0x3f3f3f3f; 12 int edge[MAXN][MAXN]; //用于存放圖 13 int used[MAXN];//用于標記點是否已加入到最小生成樹那個的集合中 14 int lowcost[MAXN]; //用于存放集合外的點到集合內的點的最短距離,每加入一個點需要更新一次 15 int N,M; 16 17 int prim(int start,int maxn) //利用prim算法計算最小生成樹 18 { 19 memset(used, 0, sizeof(used)); 20 for(int i = 1; i <= maxn; i++) 21 { 22 lowcost[i] = edge[start][i]; 23 } 24 used[start] = 1; 25 int sumweight = 0; 26 int ok = 0; 27 for(int i = 1; i <= maxn; i++) 28 { 29 int minn = INF ; 30 int v = -1; 31 for(int j = 1; j <= maxn; j++) 32 { 33 if(used[j] == 0 && lowcost[j] < minn) 34 { 35 minn = lowcost[j]; 36 v = j; 37 } 38 } 39 //cout << v << " "; 40 if(v != -1) 41 { 42 ok++; 43 used[v] = 1; 44 sumweight += lowcost[v]; 45 for(int j = 1; j <= maxn; j++) 46 { 47 if(used[j] == 0 && lowcost[j] > edge[v][j]) 48 { 49 lowcost[j] = edge[v][j]; 50 } 51 } 52 } 53 } 54 if(ok == maxn -1) 55 return sumweight; 56 return -1; 57 } 58 59 int main() 60 { 61 while(cin >> N >> M && N) 62 { 63 memset(edge, 0x3f, sizeof(edge)); 64 while(N--) 65 { 66 int u, v, w; 67 cin >> u >> v >> w; 68 edge[u][v] = edge[v][u] = w; 69 } 70 int ans = prim(1, M); 71 if(ans < 0) cout << "?" <<endl; 72 else cout << ans << endl; 73 } 74 return 0; 75 }

?

以下是JAVA的K算法

?

1 import java.util.Scanner; 2 import java.util.Comparator; 3 import java.util.Arrays; 4 import java.text.DecimalFormat; 5 6 class Vge{ 7 int u; 8 int v; 9 int w; 10 } 11 12 class mycmp implements Comparator<Vge>{ 13 public int compare( Vge A, Vge B ){ 14 if( A.w - B.w != 0 ) 15 return A.w - B.w; 16 else 17 return A.w - B.w; 18 } 19 } 20 21 public class Main{ 22 final static int MAXN = 100 + 3; 23 static int[] pre = new int[ MAXN ]; 24 static Vge[] clg = new Vge[ MAXN * MAXN ]; 25 public static void main( String[] args ){ 26 Scanner sc = new Scanner( System.in ); 27 int n, m; 28 while( sc.hasNextInt() ){ 29 n = sc.nextInt(); 30 m = sc.nextInt(); 31 if( n == 0 ) break; 32 for( int i = 0; i < n; i++ ){ 33 clg[ i ] = new Vge(); 34 clg[ i ].u = sc.nextInt(); 35 clg[ i ].v = sc.nextInt(); 36 clg[ i ].w = sc.nextInt(); 37 } 38 mst( m ); 39 int ans = ksu( n, m ); 40 if( ans == -1 ) System.out.println( "?" ); 41 else System.out.println( ans ); 42 } 43 sc.close(); 44 } 45 public static void mst( int n ){ 46 for( int i = 0; i <= n; i++ ){ 47 pre[i] = i; 48 } 49 } 50 public static int find( int x ){ 51 return x == pre[ x ] ? x : ( pre[ x ] = find( pre[ x ] ) ); 52 } 53 public static int ksu( int n, int m ){ 54 Arrays.sort( clg, 0, n, new mycmp() ); 55 int cnt = 0; 56 int ans = 0; 57 for( int i = 0; i < n; i++ ){ 58 int fu = find( clg[ i ].u ); 59 int fv = find( clg[ i ].v ); 60 if( fu != fv ){ 61 ans += clg[i].w; 62 cnt ++; 63 pre [ fv ] = fu; 64 } 65 if( cnt == m - 1 ) return ans; 66 } 67 return -1; 68 } 69 }

轉載于:https://www.cnblogs.com/Ash-ly/p/5397646.html

總結

以上是生活随笔為你收集整理的HDU 1863 畅通工程 最小生成树的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 青草青在线视频 | 日韩在线精品 | 葵司免费一区二区三区四区五区 | av人人干 | 欧美大肚乱孕交hd孕妇 | 日本中文字幕成人 | 日本在线观看www | 久久国产影院 | 欧美成人xxx | 欧美日韩网址 | 毛片少妇 | 中文一区二区在线观看 | 色啪综合 | 四虎影视最新网址 | 日韩精品无码一区二区三区 | 国产国拍精品亚洲 | aa在线| 欧美男人天堂网 | 成人黄色三级视频 | 日韩va视频 | 肉肉h| 男人的天堂国产 | 三级做爰第一次 | 亚洲精品国产精品乱码不66 | 久久中文字 | 欧美日韩激情在线观看 | 亚洲美女视频一区 | av影视在线 | 特级a毛片 | 另类视频在线观看 | 四虎影院在线免费播放 | 国产日韩一区二区三区在线观看 | 久久精品国产av一区二区三区 | 美女国产免费 | 深夜视频一区二区 | 亚洲免费观看在线 | 欧美a∨亚洲欧美亚洲 | 天堂网va| 婷婷视频在线 | 色av资源| 无码人妻丰满熟妇区毛片18 | 少妇色| 午夜黄色一级片 | 亚洲av成人精品午夜一区二区 | 澳门av网站 | 中文字幕日韩亚洲 | 久久亚洲中文字幕无码 | 亚洲网址| 日韩一级二级三级 | 欧美三级日本三级 | 国产精品77 | 黄色一级大片在线免费看产 | 国产亚洲网站 | 日韩亚洲欧美中文字幕 | 欧美视频xxxx | 天天夜夜草 | 亚洲一区二区三区成人 | 成人淫片 | 日韩在观看线 | 天堂在线中文在线 | 天天射夜夜骑 | 夜夜嗨av色一区二区不卡 | 老湿机69福利区午夜x片 | 不卡av在线播放 | 99re最新| 日韩高清影视 | 51精品 | 国产一区二区三区亚洲 | 秋霞影院午夜丰满少妇在线视频 | 91精品国产99久久久久久红楼 | 国产日韩视频在线观看 | 欧美成人a | a黄色片| 久久久久久艹 | 中文字幕五区 | 91夜色| 男女午夜网站 | 男人的天堂在线视频 | 少妇伦子伦精品无吗 | 91九色网 | 国产免费av一区二区三区 | 亚洲色图综合网 | 99re这里 | 亚洲国产一区二区三区四区 | 影音先锋激情在线 | 亚洲三区视频 | 午夜天堂视频 | 红桃视频一区二区三区免费 | 男人天堂导航 | 亚洲日本japanese丝袜 | 成人免费大片黄在线播放 | 初恋视频污| 日韩午夜激情电影 | 九九自拍 | 内射一区二区三区 | 性激烈视频在线观看 | 亚洲人午夜精品 | 午夜少妇av | 久久久天堂 |