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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

51nod-1640--天气晴朗的魔法(简单最小生成树)

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51nod-1640--天气晴朗的魔法(简单最小生成树) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1640 天氣晴朗的魔法

題目來源: 原創

基準時間限制:1 秒 空間限制:131072 KB 分值: 20 難度:3級算法題

這樣陰沉的天氣持續下去,我們不免擔心起他的健康。

51nod魔法學校近日開展了主題為“天氣晴朗”的魔法交流活動。

N名魔法師按陣法站好,之后選取N - 1條魔法鏈將所有魔法師的魔力連接起來,形成一個魔法陣。

魔法鏈是做法成功與否的關鍵。每一條魔法鏈都有一個魔力值V,魔法最終的效果取決于陣中所有魔法鏈的魔力值的和。

由于逆天改命的魔法過于暴力,所以我們要求陣中的魔法鏈的魔力值最大值盡可能的小,與此同時,魔力值之和要盡可能的大。

現在給定魔法師人數N,魔法鏈數目M。求此魔法陣的最大效果。

Input

兩個正整數N,M。(1 <= N <= 10^5, N <= M <= 2 * 10^5)接下來M行,每一行有三個整數A, B, V。(1 <= A, B <= N, INT_MIN <= V <= INT_MAX)保證輸入數據合法。

Output

輸出一個正整數R,表示符合條件的魔法陣的魔力值之和。

Input示例

4 6 1 2 3 1 3 1 1 4 7 2 3 4 2 4 5 3 4 6

Output示例

12??

分析:

其實這個題目讀懂題目后很好做,求的是在最大值最小的前提下,魔法值之和最大的生成樹

其實就是先求出最小生成樹之后,記錄一下生成樹中的最大值,然后求邊權最大值為這個值的最大生成樹

注意51行到53行,一定要進行這一步處理,不然會WA。。。。

代碼:

1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAXN=100000+30; 4 const int MAXM=2*MAXN+30; 5 int f[MAXN]; 6 struct edge 7 { 8 int u,v; 9 long long w; 10 }e[MAXM]; 11 int tot; 12 void addedge(int v,int u,int w) 13 { 14 e[tot].v=v; 15 e[tot].u=u; 16 e[tot].w=w; 17 tot++; 18 } 19 int fin(int x) 20 { 21 if(f[x]==-1) 22 return x; 23 else{ 24 f[x]=fin(f[x]); 25 return f[x]; 26 } 27 } 28 bool cmp(edge a,edge b) 29 { 30 return a.w<b.w; 31 } 32 long long kru(int n) 33 { 34 memset(f,-1,sizeof(f)); 35 sort(e,e+tot,cmp); 36 long long num=0,ans=0; 37 int u,v,w; 38 int i; 39 for(i=0;i<tot;i++){ 40 u=e[i].u,v=e[i].v,w=e[i].w; 41 int t1=fin(u); 42 int t2=fin(v); 43 if(t1!=t2){ 44 num++; 45 f[t2]=t1; 46 } 47 if(num==n-1) break; 48 } 49 num=0; 50 memset(f,-1,sizeof(f)); 51 while(e[i].w==e[i+1].w){ 52 i++; 53 } 54 for(;i>=0;i--){ 55 u=e[i].u,v=e[i].v,w=e[i].w; 56 int t1=fin(u); 57 int t2=fin(v); 58 if(t1!=t2){ 59 num++; 60 ans+=w; 61 f[t2]=t1; 62 } 63 if(num==n-1) break; 64 } 65 if(num<n-1) return -1; 66 else return ans; 67 } 68 int main() 69 { 70 //freopen("data.in","r",stdin); 71 int n,m; 72 int a,b; 73 long long v; 74 tot=0; 75 scanf("%d%d",&n,&m); 76 for(int i=0;i<m;i++){ 77 scanf("%d%d%lld",&a,&b,&v); 78 addedge(a,b,v); 79 } 80 //printf("%lld\n",kru(n)); 81 cout<<kru(n)<<endl; 82 } 83 View Code

轉載于:https://www.cnblogs.com/liuzhanshan/p/6736241.html

總結

以上是生活随笔為你收集整理的51nod-1640--天气晴朗的魔法(简单最小生成树)的全部內容,希望文章能夠幫你解決所遇到的問題。

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