日韩性视频-久久久蜜桃-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 畅通工程 最小生成树的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 欧美日韩在线免费视频 | 久久国产91 | 日本美女一区 | 黄色片子视频 | 饥渴的少妇和男按摩师 | av日韩一区 | 午夜免费 | 九九热这里有精品视频 | 久热国产在线 | 欧美午夜精品久久久久久浪潮 | 操啊操 | 黄色大全免费看 | 三男一女吃奶添下面 | 99re8在线精品视频免费播放 | 亚洲精品久久久乳夜夜欧美 | 成人深夜影院 | 国产手机av | 亚洲人妻电影一区 | 美日韩精品视频 | 自拍偷拍中文字幕 | 爽爽窝窝午夜精品一区二区 | 婷婷免费视频 | jizz在线观看视频 | 国产人妻精品一区二区三区不卡 | 免费视频日韩 | 神马午夜伦理影院 | 好了av在线| 日韩三级一区二区三区 | 牛牛影视一区二区 | 欧美激情在线观看一区 | 国产www精品 | 午夜在线影院 | 亚洲av无码一区二区三区在线观看 | 亚洲成在人 | 91高清网站 | 男人的天堂a在线 | 91免费看片网站 | 免费看片色| 日本一区精品视频 | 另类性姿势bbwbbw | 精品国产乱码一区二区三 | 欧美黄色录像片 | 国产98在线| 国产欧美一区二区三区在线看 | 91精品在线免费观看 | 手机看片日韩福利 | 日本激情免费 | 白浆网站 | 国产一区二区三区四区五区美女 | 好爽…又高潮了毛片免费看 | 亚洲天堂123 | 色屋永久| 国内自拍在线观看 | 91色交视频| 亚洲av日韩精品久久久久久久 | 国产精品乱码一区二区视频 | 国产精品理论片在线观看 | 手机福利在线 | 亚洲成人天堂 | 欧美一区二区三区在线 | 美女诱惑一区二区 | 国产精品99久久久精品无码 | 亚洲天堂小视频 | 久久av免费看 | 国产免费黄色网址 | 中文人妻熟妇乱又伦精品 | jizz日本视频 | 日韩在线电影一区 | a亚洲精品| 特黄做受又粗又大又硬老头 | 亚洲欧美色图在线 | 欧美一区综合 | 91美女片黄在线观看 | 成年人黄色 | 国产91精选| 欧美sm视频 | 精品视频免费 | 国产男男gay | 一卡二卡三卡 | 精品人妻少妇一区二区三区 | 日韩精品一区二区三区免费视频 | 国产精品久久久99 | 五月婷综合 | www.av在线视频 | 午夜电影福利网 | 成人精品一区二区三区电影黑人 | 国产精品99精品无码视 | 午夜a视频 | 一区二区高潮 | 国产中文字幕在线播放 | 性生活视频网站 | 天美麻花果冻视频大全英文版 | 欧美一级视频 | 日韩作爱视频 | 欧美不卡影院 | 91操操操 | 香蕉视频国产在线观看 | 在哪看毛片 | 精品人伦一区二区三 |