孩子调了半天了。。。思路同第一篇题解(其实是自己写错了照着改的,但是改了也只有60pts)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e6+10;
int n,m,g[N],q[N],ans,cnt,ccnt;
int h[N],w[N],e[N],ne[N],idx,p[N];
bool st[N];
void add(int a,int b,int c){e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;}
int find(int x){return p[x]==x?x:p[x]=find(p[x]);}
struct edge{int x,y,w1,w2;}edges[N];
bool cmp(edge x1,edge x2){return x1.w1==x2.w1?x1.w2<x2.w2:x1.w1>x2.w1;}
void Bfs(){
int hh=0,tt=-1;
st[1]=1;q[++tt]=1;
while(hh<=tt){
int t=q[hh++];
for(int i=h[t];~i;i=ne[i]){
int j=e[i];
edges[++m]=edge{t,j,g[j],w[i]};
if(st[j]) continue;
st[j]=true;ccnt++;
q[++tt]=j;
}
}
}
signed main(){
memset(h,-1,sizeof(h));
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&g[i]),p[i]=i;
while(m--){
int a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
if(g[a]>=g[b]) add(a,b,c);
if(g[a]<=g[b]) add(b,a,c);
}
Bfs();
sort(edges+1,edges+m+1,cmp);
for(int i=1;i<=m;i++){
int tx=edges[i].x,ty=edges[i].y,dis=edges[i].w2;
int px=find(tx),py=find(ty);
if(px!=py){
p[px]=py;
ans+=dis;
}
}
printf("%lld %lld",ccnt+1,ans);
return 0;
}