样例都没过,实在不知道错哪儿了。
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct edge{
int from,to,nxt,val;
};
int n,m;
int h[100000+5];
int u,v,k;
edge e[2000000+5],e2[2000000+5];
int cnt,cnt2;
int head[100000+5],head2[100000+5];
bool vis[2000000+5];
int f[100000+5];
int ans;
void add(edge t[],int hd[],int a,int b,int c,int &pos){
pos++;
t[pos].from=a;
t[pos].to=b;
t[pos].val=c;
t[pos].nxt=hd[a];
hd[a]=pos;
}
bool cmp(edge a,edge b){
if(h[a.to]!=h[b.to]) return h[a.to]>h[b.to];
return a.val<b.val;
}
int find(int k){
if(k!=f[k]) f[k]=find(f[k]);
return f[k];
}
void dfs(int k){
vis[k]=true;
for(int i=head[k];i;i=e[i].nxt){
if(!vis[i]){
add(e2,head2,e[i].from,e[i].to,e[i].val,cnt2);
dfs(e[i].to);
}
}
}
void kruskal(){
for(int i=1;i<=n;i++) f[i]=i;
sort(e2+1,e2+1+cnt2,cmp);
for(int i=1;i<=cnt2;i++){
int fu=find(e2[i].from),fv=find(e2[i].to);
if(fu==fv) continue;
ans+=e2[i].val;
f[fu]=fv;
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>h[i];
for(int i=1;i<=m;i++){
cin>>u>>v>>k;
if(h[u]>=h[v]) add(e,head,u,v,k,cnt);
if(h[v]>=h[u]) add(e,head,v,u,k,cnt);
}dfs(1);
kruskal();
cout<<cnt2+1<<" "<<ans;
return 0;
}