20分求助
查看原帖
20分求助
294754
_M1Ku_楼主2022/9/24 21:44
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<climits>
using namespace std;
#define maxn 1000100
int read() {
	int x = 0, w = 1;
	char ch = 0;
	while (ch < '0' || ch > '9') {
		if (ch == '-') w = -1;
		ch = getchar();               
	}
	while (ch >= '0' && ch <= '9') {  
		x = x * 10 + (ch - '0');  
		ch = getchar();
	}
	return x * w;  
}
void write(int x)
{
	if(x<0){x=-x;putchar('-');}
	if(x>9)  write(x/10);
	putchar(x%10+'0');
}


int n,m;
bool vis[maxn];
long long ans_cnt=0,ans_tot=0;
struct node{
	int num,h;
}nodee[100010];
struct edge{
	int v,w;
};
struct edgee{
	int u,v,w;
};
vector < edge >  e[100010];
vector < edgee >  ee;

bool cmp(edgee x,edgee y)
{
	if(nodee[x.v].h!=nodee[y.v].h)
	{
		return nodee[x.v].h>nodee[y.v].h;
	}
	return x.w<y.w;
}

int fa[100010];
void mekeset(int n)
{
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
	}
}
int find(int x)
{
	if(fa[x]!=x)
	{
		fa[x]=find(fa[x]);
	}
	return fa[x];
}
void mergeset(int x,int y)
{
	x=find(x);
	y=find(y);
	fa[x]=y;
}

void dfs(int now)
{
	vis[now]=true;
	ans_cnt++;
	for(int i=0;i<e[now].size();i++)
	{
		ee.push_back((edgee){now,e[now][i].v,e[now][i].w});
		if(!vis[e[now][i].v])
		{
			dfs(e[now][i].v);
		}
	}
	
}

int main()
{
	n=read(),m=read();
	mekeset(n);
	for(int i=1;i<=n;i++)
	{
		nodee[i].h=read();
		nodee[i].num=i;
	}
	for(int i=1;i<=m;i++)
	{
		int u=read(),v=read(),w=read();
		if(nodee[u].h>=nodee[v].h)
		{
			e[u].push_back((edge){v,w});
		}
		else if(nodee[u].h<=nodee[v].h){
			e[v].push_back((edge){u,w});
		}
	}
	dfs(1);
	printf("%lld",ans_cnt);
	sort(ee.begin(),ee.end(),cmp);
	long long cnt=0;
	for(int i=0;i<ee.size();i++)
	{
		if(find(ee[i].u)!=find(ee[i].v))
		{
			cnt++;
			ans_tot+=ee[i].w;
			mergeset(ee[i].u,ee[i].v);
			if(cnt==ans_cnt-1)
			{
				printf(" %lld",ans_tot);
				return 0;
			}
		}
	}
	printf(" %lld",ans_tot);
	return 0;
}
2022/9/24 21:44
加载中...