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)output接下來m行,每一行有三個整數a, b, v。(1 <= a, b <= n, int_min <= v <= int_max)
保證輸入資料合法。
輸出乙個正整數r,表示符合條件的魔法陣的魔力值之和。input示例
4 6output示例1 2 3
1 3 1
1 4 7
2 3 4
2 4 5
3 4 6
12wizmann
(題目提供者)
蜜汁最小生成樹。。。幸好搜到了大神部落格
(膜拜三分鐘先。。。)下面我來解釋一下思路:
首先看了題意是求最小生成樹,但是呢,它不是一般的最小生成樹(或許大概可能應該叫最大生成樹),這棵樹有兩個條件: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,魔法最終的效果取決於陣中所有魔法鏈的魔力值的...