版权声明:转载请附上地址 https://blog.csdn.net/weixin_44574520/article/details/87606094
[SCOI2005]繁忙的都市
题目分析:
跑一遍最小生成树,输出最小生成树的边数和边的最大权值
Code:
#include <bits/stdc++.h>
using namespace std;
#define maxn 310
#define maxm 100010
int n,m,f[maxn];
struct node{
int u,v,w;
}e[maxm];
inline int read_(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
inline void clean_(){
for(int i=0;i<302;i++) f[i]=i;
}
inline bool cmp_(node aa,node bb){
return aa.w<bb.w;
}
inline int find_(int x){
if(f[x]==x) return x;
else return f[x]=find_(f[x]);
}
inline void merge_(int x,int y){
int rx=find_(x);
int ry=find_(y);
f[rx]=ry;
}
inline void ksul_(){
int ans=0,size=0;
for(int i=1;i<=m;i++){
if(size==(n-1)){
printf("%d %d",size,ans);
exit(0);
}
if(find_(e[i].u)!=find_(e[i].v)){
ans=max(ans,e[i].w);
merge_(e[i].u,e[i].v);
size++;
}
}
}
inline void init_(){
freopen("scdushu.txt","r",stdin);
}
inline void readda_(){
clean_();
n=read_();m=read_();
for(int i=1;i<=m;i++){
e[i].u=read_();e[i].v=read_();e[i].w=read_();
}
}
inline void work_(){
sort(e+1,e+m+1,cmp_);
ksul_();
}
int main(){
init_();
readda_();
work_();
return 0;
}