P1195口袋的天空

一、题目描述

  

 

 二、解题思路

  利用kruscal算法求解,原来一共有n个点,看看能不能缩成k个点,如果能就输出ans,如果不能输出No Answer。因为kruscal是从最小的边开始,所以答案肯定是最小的,符合正确性。

三、代码实现

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 int n,m,k;
 4 int a[1010];
 5 struct node{
 6     int from,to;
 7     int w;
 8 }edges[10010];
 9 int vis[1010];
10 int cnt;
11 int find(int u)
12 {
13     return u == a[u] ? u : a[u] = find(a[u]);
14 }
15 void init()
16 {
17     for(int i = 1;i <= n;i++)
18         a[i] = i;
19 }
20 bool cmp(node u,node v)
21 {
22     return u.w < v.w;
23 }
24 int main()
25 {
26     cin >> n >> m >> k;
27     for(int i = 1;i <= m;i++){
28         int u,v,w;
29         cin >> u >> v >> w;
30         edges[++cnt].from = u;
31         edges[cnt].to = v;
32         edges[cnt].w = w;
33     }
34     if(n < k){
35         cout << "No Answer";
36         return 0;
37     }
38     init();
39     sort(edges + 1,edges + 1 + cnt,cmp);
40     int tt = n;
41     long long ans = 0;
42     for(int i = 1;i <= cnt;i++){
43         int sx = find(edges[i].from);
44         int sy = find(edges[i].to);
45         if(sx != sy){
46             a[sx] = sy;
47             ans += edges[i].w;
48             tt--;
49         }
50         if(tt == k)
51             break;
52     }
53     if(tt != k)
54         cout << "No Answer";
55      else 
56         cout << ans;
57     return 0;
58 }
posted @ 2022-02-15 21:25  scannerkk  阅读(46)  评论(0)    收藏  举报