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 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}