/(ㄒoㄒ)/~~,一直爆零,求大佬指点P2573
  • 板块学术版
  • 楼主Durancer
  • 当前回复1
  • 已保存回复1
  • 发布时间2020/9/26 13:42
  • 上次更新2023/11/5 12:35:44
查看原帖
/(ㄒoㄒ)/~~,一直爆零,求大佬指点P2573
230804
Durancer楼主2020/9/26 13:42
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
using namespace std;
struct node{
	int sta;
	int to;
	long long int dis;
}edge[4000009];
struct ee{
	long long int dis;
	int last;
	int to;
}e[4000009];
int sum=0;
int e_num;
int head[1000009];
void ed(int from,int to,int dis)
{
	e[++e_num].last=head[from];
	e[e_num].to=to;
	e[e_num].dis=dis;
	head[from]=e_num;
}
int bj[1000009];
int tall[1000009];
long long int ans;
int cnt;
int n,m;
int fu[1000009];
int js=1;
int cmp(node x,node y)
{
	if(tall[x.to]==tall[x.to])
	return x.dis<y.dis;
	return tall[x.to]>tall[y.to];
}
void bfs()
{
	queue<int> q;
	q.push(1);
	bj[1]=1;
	while(!q.empty())
	{
		int cun=q.front();
		q.pop();
		for(int i=head[cun];i;i=e[i].last)
		{
			int gogo=e[i].to;
			edge[++sum].sta=cun;
			edge[sum].to=gogo;
			edge[sum].dis=e[i].dis;
			if(bj[gogo]==0)
			{	
				bj[gogo]=1;
				q.push(gogo);
				++js;
				
			}
		}
	}
}
int findd(int u)
{
	int x=u;
	while(x!=fu[x])
	{
		return fu[x]=findd(fu[x]);
	}
	return fu[x];
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>tall[i];
	}
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		if(tall[x]>=tall[y]) ed(x,y,z);
		if(tall[x]<=tall[y]) ed(y,x,z);
	}
	bfs();
	sort(edge+1,edge+1+sum,cmp);
	for(int i=1;i<=n;i++)
	{
		fu[i]=i;
	}
	for(int i=1;i<=sum;i++)
	{
		int u=findd(edge[i].sta);
		int v=findd(edge[i].to);
		if(u==v) continue;
		fu[u]=v;
		ans+=edge[i].dis;
		cnt++;
		if(cnt==js-1)
		{
			break;
		}
	}
	cout<<js<<" "<<ans<<endl;
	return 0;
}
2020/9/26 13:42
加载中...