题目:给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;}