这题给的输入输出好像不太对,怎么做都是178,但是提交的样例都过了。
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class _11 {
static class edge{
int s,e,l;
}
static edge[] es=new edge[100005];
static int[] c=new int[10005];
static int N,P;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
N=sc.nextInt();
P=sc.nextInt();
int min=999999999;
for (int i = 0; i < es.length; i++) {
es[i]=new edge();
}
for (int i = 1; i <= N; i++) {
c[i]=sc.nextInt();
if(c[i]<min)min=c[i];
}
for (int i = 0; i < P; i++) {
int s=sc.nextInt();
int e=sc.nextInt();
int l=sc.nextInt();
es[i].e=e;es[i].s=s;es[i].l=2*l+c[s]+c[e];
}
Comparator<edge> cmp=new Comparator<edge>() {
@Override
public int compare(edge o1, edge o2) {
return o1.l-o2.l;
}
};
Arrays.sort(es,0,P,cmp);
System.out.println(kruskal()+min);
}
static int kruskal(){
init(N);
int res=0;
for (int i = 0; i < P; i++) {
if(!same(es[i].e,es[i].s)){
unity(es[i].s,es[i].e);
res+=es[i].l;
}
}
return res;
}
static int[] par=new int[100005];
static int[] rank=new int[100005];
static void init(int n){
for (int i = 0; i < n; i++) {
par[i]=i;
rank[i]=0;
}
}
static int find(int x){
if(par[x]==x)return x;
else{
return par[x]=find(par[x]);
}
}
static void unity(int x,int y){
x=find(x);
y=find(y);
if(x==y)return;
if(rank[y]>rank[x]){
par[x]=y;
}else{
par[y]=x;
if(rank[x]==rank[y])rank[x]++;
}
}
static boolean same(int x,int y){
return find(x)==find(y);
}
}