51Nod 1640 天氣晴朗的魔法

2021-08-18 14:37:43 字數 1823 閱讀 9034

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
wizmann

(題目提供者)

蜜汁最小生成樹。。。幸好搜到了大神部落格

(膜拜三分鐘先。。。)下面我來解釋一下思路:

首先看了題意是求最小生成樹,但是呢,它不是一般的最小生成樹(或許大概可能應該叫最大生成樹),這棵樹有兩個條件:1.最大的邊盡可能的小 2.樹的權值盡可能的大,什麼意思呢?就是說我先找一棵權值最小的生成樹——這時候它最大的邊一定是最小的(因為構造最小生成樹的時候每一條邊都是選擇符合條件的最小的),這時候我們就把它最大的邊記錄下來,然後試著把它其餘的邊換成權值比較大的邊,這樣就可以滿足兩個條件了。

下面是**部分↓↓↓

#include #include #include #define ll long long

#define maxn 100010

#define inf 0x3f3f3f3f

using namespace std;

//邊的集合

struct edge edge[ maxn*2 ];

//記錄根節點

int vis[maxn];

//從小到大排序以找到最小的最大邊

bool cmpmin( edge aa , edge bb )

//尋找根節點

int find( int x )

return r;

}//傳入圖的頂點數和邊數,計算最小生成樹的最大邊

ll kruskalminsumvalue( int n , int m )

//最大生成樹構造完成

if( cnt == n-1 )

return sum;

} return -1;

}int main()

//取得最大邊的最小值

ll maxvalue = kruskalminsumvalue( n,m );

//取得限定邊情況下最大生成樹的權

ll maxsumvalue = kruskalmaxsumvalue( n,m,maxvalue );

printf( "%lld\n",maxsumvalue );

}

that's all .

51nod1640天氣晴朗的魔法

1640 天氣晴朗的魔法 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 這樣陰沉的天氣持續下去,我們不免擔心起他的健康。51nod魔法學校近日開展了主題為 天氣晴朗 的魔法交流活動。n名魔法師按陣法站好,之後選取n 1條魔法鏈將所有魔法師的魔力連線起來,形成乙個...

51nod 1640 天氣晴朗的魔法(並查集)

1640 天氣晴朗的魔法 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 這樣陰沉的天氣持續下去,我們不免擔心起他的健康。51nod魔法學校近日開展了主題為 天氣晴朗 的魔法交流活動。n名魔法師按陣法站好,之後選取n 1條魔法鏈將所有魔法師的魔力連線起來,形成乙個...

51 nod 1640天氣晴朗的魔法(最小生成樹)

這樣陰沉的天氣持續下去,我們不免擔心起他的健康。51nod魔法學校近日開展了主題為 天氣晴朗 的魔法交流活動。n名魔法師按陣法站好,之後選取n 1條魔法鏈將所有魔法師的魔力連線起來,形成乙個魔法陣。魔法鏈是做法成功與否的關鍵。每一條魔法鏈都有乙個魔力值v,魔法最終的效果取決於陣中所有魔法鏈的魔力值的...