80pts求调
查看原帖
80pts求调
785917
Chthollian楼主2024/10/2 18:38
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,cnt,g[100005],h[100005],vis[100005],ans1;
long long ans2;
struct Edge
{
	int from,to;
	long long val;
} edge[1000005];
vector<pair<int,long long>> too[100005];
bool cmp(Edge x,Edge y)
{
	return (h[x.to]==h[y.to]?x.val<y.val:h[x.to]>h[y.to]);
}
int dfn(int x)
{
	return (x==g[x]?x:g[x]=dfn(g[x]));
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		g[i]=i;
		cin>>h[i];
	}
	for(int i=1;i<=m;i++)
	{
		int u,v;
		long long w;
		cin>>u>>v>>w;
		if(h[u]>=h[v])
		{
			too[u].emplace_back(make_pair(v,w));
		}
		if(h[v]>=h[u])
		{
			too[v].emplace_back(make_pair(u,w));
		}
	}
	queue<int> q;
	q.emplace(1);
	while(q.size())
	{
		int now=q.front();
		q.pop();
		for(pair<int,int> to:too[now])
		{
			edge[++cnt].from=now,edge[cnt].to=to.first;
			edge[cnt].val=to.second;
			if(!vis[to.first])
			{
				ans1++;
				vis[to.first]=1;
				q.emplace(to.first);
			}
		}
	}
	sort(edge+1,edge+cnt+1,cmp);/*
	for(int i=1;i<=cnt;i++)
	{
		cout<<edge[i].to<<" "<<edge[i].val<<"\n";
	}*/
	for(int i=1;i<=cnt;i++)
	{
		if(dfn(edge[i].from)==dfn(edge[i].to))
		{
			continue;
		}
		//cout<<edge[i].from<<" "<<edge[i].to<<" "<<edge[i].val<<"\n";
		g[dfn(edge[i].from)]=edge[i].to;
		//cout<<edge[i].val<<"\n";
		ans2+=edge[i].val;
	}
	cout<<ans1+1<<" "<<ans2;
}
2024/10/2 18:38
加载中...