#include<iostream> #include<cstdio> #include<algorithm> using namespace std; #define LL long long LL fa[300000],FA[300000]; LL n,m,x,y,z,ans,sum,tot,t,w,now,p; LL a[300000],q[300000],head[300000],last[300000]; bool vis[300000]; struct edge{ LL u,v,dis,next; bool operator < (const edge x) const{ if (a[v]==a[x.v]) return dis<x.dis; return a[v]>a[x.v]; } } e[3000000]; void init(int n){ for (int i=1;i<=n;i++) fa[i]=i; } int find(int x){ if (x==fa[x]) return x; fa[x]=find(fa[x]); return fa[x]; } void add(int x,int y,int z){ tot++; e[tot].u=x; e[tot].v=y; e[tot].dis=z; if (head[x]==0) head[x]=tot; else e[last[x]].next=tot; last[x]=tot; } void bfs(){ sum=1; q[1]=1; vis[1]=1; t=0; w=1; while (t<w){ t++; now=q[t]; p=head[now]; while (p>0){ if (!vis[e[p].v]){ vis[e[p].v]=1; w++; sum++; q[w]=e[p].v; } p=e[p].next; } } } int main(){ scanf("%lld%lld",&n,&m); for (int i=1;i<=n;i++) scanf("%lld",&a[i]); for (int i=1;i<=m;i++){ scanf("%lld%lld%lld",&x,&y,&z); if (a[x]>=a[y]) add(x,y,z); if (a[y]>=a[x]) add(y,x,z); } bfs(); sort(e+1,e+tot+1); init(n); for (int i=1;i<=tot;i++) if (vis[e[i].u] && vis[e[i].v]){ int fu=find(e[i].u),fv=find(e[i].v); if (fu!=fv){ fa[fv]=fu; ans+=e[i].dis; } } printf("%lld %lld\n",sum,ans); return 0; }
|