胡队长带领HA实验的战士们玩真人CS,真人CS的地图由一些据点组成,现在胡队长已经占领了n个据点,为了方便,将他们编号为1-n,为了隐蔽,胡队长命令战士们在每个据点出挖一个坑,让战士们躲在坑里。由于需要在任意两个点之间传递信息,两个坑之间必须挖出至少一条通路,而挖沟是一件很麻烦的差事,所以胡队长希望挖出数量尽可能少的沟,使得任意两个据点之间有至少一条通路,顺便,尽可能的∑d[i][j]使最小(其中d[i][j]为据点i到j的距离)。
Kruskal模板
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int N = 1e5+10,M =5e5+10;
int n,m,res;
struct edge{
int a,b,w;
bool operator<(struct edge s){
return w<s.w;
}
}edges[M];
int p[N];
int find(int x){
while(p[x]!=x){
p[x]=p[p[x]];
x=p[x];
}
return p[x];
}
void init(){
for(int i=1;i<=n;i++)p[i]=i;
}
int main(){
cin>>n>>m;
init();
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
edges[i]={a,b,c};
}
sort(edges,edges+m);
for(int i=0;i<m;i++)
{
int a=edges[i].a,b=edges[i].b,w=edges[i].w;
if(find(a)!=find(b)){
p[find(a)]=find(b);
res+=w;
}
}
cout<<res;
}