洛谷 P2330 [SCOI2005]繁忙的都市 最小生成树
题解:
题目共有三个条件:
1.改造的那些道路能够把所有的交叉路口直接或间接的连通起来。
2.在满足要求1的情况下,改造的道路尽量少。
3.在满足要求1、2的情况下,改造的那些道路中分值最大的道路分值尽量小。
其实第三个条件就是最小生成树的性质。
代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<queue>
#include<cstring>
#include<vector>
#include<map>
#define MAX 305
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n,m;
int fa[MAX];
int findfather(int x){
if(x!=fa[x]){
return fa[x]=findfather(fa[x]);
}
return fa[x];
}
struct edge{
int a,b,len;
}e[100005];
bool cmp(edge a,edge b){
return a.len<b.len;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
fa[i]=i;
}
int a,b,len;
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&len);
e[i].a=a,e[i].b=b,e[i].len=len;
}
sort(e,e+m,cmp);
int maxl=-1;
for(int i=0;i<m;i++){
if(findfather(e[i].a)!=findfather(e[i].b)){
fa[findfather(e[i].a)]=findfather(e[i].b);
maxl=max(maxl,e[i].len);
}
}
printf("%d %d",n-1,maxl);
return 0;
}