题目很不好懂~ 总的来说就是访问完所有的节点之后 返回起始点
最小生成树 克鲁斯卡尔
每个节点也是有权值的,总的来说每个边 要算两次边的权值 和一次两个顶点的权值
最后还要加上 起始点的权值
#include<iostream>
#include<algorithm>
using namespace std;
int n,p,c[100010];
struct node{
int a,b,v;
}s[100005];
int f[100010],minn=INT_MAX;
bool cmp1(node x,node y){
return x.v<y.v;
}
void init(){
for(int i=0;i<=n;i++)
f[i]=i;
}
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
int main(){
int i,j,k=0;
long long sum=0;
scanf("%d %d",&n,&p);
init();
for(i=0;i<n;i++)
{
scanf("%d",&c[i]);
if(minn>c[i])
minn=c[i];
}
for(int i=0;i<p;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
s[i].a=x;s[i].b=y;
s[i].v=c[x-1]+c[y-1]+2*z;
}
sort(s,s+p,cmp1);
for(i=0;i<p;i++){
int a1=find(s[i].a),b1=find(s[i].b);
if(a1==b1) continue;
if(a1>b1) swap(a1,b1);
f[b1]=a1;
sum+=s[i].v;
}
sum+=minn;
cout<<sum;
return 0;
}