题目链接: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 }