题目:给n个点,m条加权边。用最大距离连接所有点。
题解:裸的最大生成树。我用的kruskal。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
struct node{//每条边的两顶点以及距离
int from;
int to;
int len;
}edge[50000];
int f[1100];
int ans,n,m,k;
bool cmp(node a, node b){
return a.len > b.len;
}
int find(int x){//并查集
while(x!=f[x]){
x=f[x];
}
return x;
}
void join(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy) f[fx]=fy;
}
int kruskal(){//最小生成树
sort(edge,edge+m,cmp);//边长度由小到大排序
ans = 0;
k=0;
for(int i=0;i<=n;i++) f[i] = i; for(int j = 0; j < m && k < n-1; j++){
if(find(edge[j].from) != find(edge[j].to)){//如何两点未在一个并查集便合并
join(edge[j].from,edge[j].to);
ans+=edge[j].len;
k++;
//cout<<k<<endl;
}
}
return ans;
}
int main(){
while(cin>>n>>m){
for(int i=0;i<m;i++) cin>>edge[i].from>>edge[i].to>>edge[i].len;
int tot = kruskal();
if(k<n-1) cout<<"-1"<<endl;
else cout<<tot<<endl;
}
return 0;
}