1. 程式人生 > >2017"百度之星"程序設計大賽 - 資格賽 度度熊的王國戰略

2017"百度之星"程序設計大賽 - 資格賽 度度熊的王國戰略

set ear sin 們的 ret ont 十分 turn std

度度熊的王國戰略

度度熊國王率領著喵哈哈族的勇士,準備進攻嘩啦啦族。

嘩啦啦族是一個強悍的民族,裏面有充滿智慧的謀士,擁有無窮力量的戰士。

所以這一場戰爭,將會十分艱難。

為了更好的進攻嘩啦啦族,度度熊決定首先應該從內部瓦解嘩啦啦族。

第一步就是應該使得嘩啦啦族內部不能同心齊力,需要內部有間隙。

嘩啦啦族一共有n個將領,他們一共有m個強關系,摧毀每一個強關系都需要一定的代價。

現在度度熊命令你需要摧毀一些強關系,使得內部的將領,不能通過這些強關系,連成一個完整的連通塊,以保證戰爭的順利進行。

請問最少應該付出多少的代價。

Input

本題包含若幹組測試數據。

第一行兩個整數n,m,表示有n個將領,m個關系。

接下來m行,每行三個整數u,v,w。表示u將領和v將領之間存在一個強關系,摧毀這個強關系需要代價w

數據範圍:

2<=n<=3000

1<=m<=100000

1<=u,v<=n

1<=w<=1000

Output

對於每組測試數據,輸出最小需要的代價。

Sample Input
2 1
1 2 1
3 3
1 2 5
1 2 4
2 3 3
Sample Output
1
3
解法:
1 題意瞎猜,不一定是正確解法(重點是這句)
2 我們用並查集把它們的集合先分一分,再保存每個集合裏面的元素
3 把點連的每一條邊權值算在點自己本身
 比如 1 2 3 和 2 3 4 那麽2這個點就是3+4==7,1權值是3,3權值是4,註意重邊是相加不算取最小
4 保存下來的每一個集合都取各自元素權值的最小值,加起來就行
5 我理解的題意是每個塊都必須獨立出一個點就算是不能形成“完整的連通塊”,如果是1-2-3-4-1形成一個圈,也必須獨立出一個點,而不是斷開形成1-2 3-4
6 本身獨立的不算在內
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e5+10;
 4 vector<int>Ve[maxn];
 5 map<int,int>Mp,mp;
 6 int tree[2*maxn];
 7 int Find(int x)
 8 {
 9     if(x==tree[x])
10         return x;
11     return tree[x]=Find(tree[x]);
12 }
13 int X[3010][3010];
14 void Merge(int
x,int y) 15 { 16 int fx=Find(x); 17 int fy=Find(y); 18 if(fx!=fy){ 19 tree[fx]=fy; 20 } 21 } 22 int n,m; 23 int main(){ 24 while(~scanf("%d%d",&n,&m)){ 25 memset(X,0,sizeof(X)); 26 Mp.clear(); 27 mp.clear(); 28 for(int i=1;i<=n;i++){ 29 Ve[i].clear(); 30 } 31 for(int i=1;i<=n;i++){ 32 tree[i]=i; 33 } 34 for(int i=1;i<=m;i++){ 35 int s,t,w; 36 scanf("%d%d%d",&s,&t,&w); 37 if(X[s][t]){ 38 X[s][t]+=w; 39 X[t][s]+=w; 40 }else{ 41 X[s][t]=w; 42 X[t][s]=w; 43 } 44 Merge(s,t); 45 } 46 for(int i=1;i<=n;i++){ 47 for(int j=1;j<=n;j++){ 48 if(i==j) continue; 49 Mp[i]+=(X[i][j]); 50 } 51 } 52 for(int i=1;i<=n;i++){ 53 if(mp[Find(i)]){ 54 mp[Find(i)]=min(mp[Find(i)],Mp[i]); 55 }else{ 56 mp[Find(i)]=Mp[i]; 57 } 58 Ve[Find(i)].push_back(i); 59 } 60 long long sum=0; 61 for(int i=1;i<=n;i++){ 62 if(Find(i)==i){ 63 if(Ve[i].size()>1){ 64 sum+=mp[i]; 65 } 66 } 67 } 68 printf("%lld\n",sum); 69 } 70 return 0; 71 }

2017"百度之星"程序設計大賽 - 資格賽 度度熊的王國戰略