未过样例,0opt
查看原帖
未过样例,0opt
776337
sugawara楼主2024/3/17 17:21
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
const int M=1e6+10;
int n,m,u,v,w,ans,cnt,sum,h[N],fa[N],head[M],q[N],r,l,top;
bool vis[N];
struct node{
	int d,w,nxt;
}eg[M];
struct Node{
	int u,v,w;
}new_edge[M];
void build(int u,int v,int w){
	eg[++top].d=v,eg[top].w=w,eg[top].nxt=head[u],head[u]=top;
}
int find(int x){
	if(fa[x]==x) return x;
	else return fa[x]=find(fa[x]);
}
void unity(int x,int y){
	if(find(x)!=find(y)) fa[find(y)]=find(x);
}
int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0' || c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0' && c<='9') x=x*10+c-'0',c=getchar();
	return f==1?x:-x;
}
bool cmp(Node a,Node b){
	if(h[a.v]!=h[b.v]) return h[a.v]>h[b.v];
	return a.w<b.w;
}
void bfs(){
	q[++r]=1,vis[1]=1;
	while(l<r){
		int now=q[++l];
		for(int i=head[now];i;i=eg[i].nxt){
			new_edge[++cnt].u=now,new_edge[cnt].v=eg[i].d,new_edge[cnt].w=eg[i].w;
			if(!vis[new_edge[i].v]) vis[new_edge[i].v]=1,sum++,q[++r]=new_edge[i].v;
		}
	}
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=n;i++) h[i]=read();
	for(int i=1;i<=m;i++){
		u=read(),v=read(),w=read();
		if(h[u]>=h[v]) build(u,v,w);
		if(h[u]<=h[v]) build(v,u,w);
	}bfs();sort(new_edge+1,new_edge+1+cnt,cmp);
	for(int i=1;i<=cnt;i++){
		if(find(new_edge[i].u)!=find(new_edge[i].v)){
			fa[find(new_edge[i].u)]=find(new_edge[i].v);
			ans+=new_edge[i].w;
		}
	}
	printf("%d %d",sum+1,ans);
	return 0;
}
2024/3/17 17:21
加载中...