洛谷 P2330 [SCOI2005]繁忙的都市(最小生成树)

题目链接:https://www.luogu.org/problemnew/show/P2330

这道题的问法也实在是太模板了吧:

1.改造的道路越少越好

2.能够把所有的交叉路口直接或间接的连通起来

3.改造的那些道路中分值最大的道路分值尽量小

 

通过这些就可以判断出这是一道最小生成树的题(如果你还不了解最小生成树,请点击此网址查看:https://www.cnblogs.com/New-ljx/p/10779353.html

思路:

就是一个最小生成树的模板,在最后将x点和y点合并的时候加上一个计数器cnt和一个maxn来保留最大值即可。

AC代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 int cnt, maxn;
 8 int f[1005];
 9 
10 struct node{
11     int x, y, l;
12 } a[100005];
13 
14 inline int cmp(node i, node j){
15     return i.l < j.l;
16 }
17 
18 inline int find(int x){
19     if(x != f[x])
20         f[x] = find(f[x]);
21     return f[x];
22 }
23 
24 int main(){
25     int n, m;
26     scanf("%d%d", &n, &m);
27     for(int i = 1; i <= m; i++){
28         scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].l);
29     }
30     for(int i = 1; i <= n; i++){
31         f[i] = i;
32     }
33     sort(a+1, a+1+m, cmp);
34     for(int i = 1; i <= m; i++){
35         int r1 = find(a[i].x);
36         int r2 = find(a[i].y);
37         if(r1 != r2){
38             f[r1] = r2;
39             cnt++;//计数器 
40             maxn = max(maxn, a[i].l);//保存最大值 
41         }
42     }
43     printf("%d %d", cnt, maxn);
44     return 0;
45 }
AC代码
原文地址:https://www.cnblogs.com/New-ljx/p/10779439.html