样例过了但一分没有
查看原帖
样例过了但一分没有
342494
wxh666楼主2022/7/27 19:10
#include<bits/stdc++.h>
#define int long long
#define guo continue
#define tiao break
#define g return 0
using namespace std;

typedef int lsqxx;
struct lq{
	lsqxx to,w,nxt;
}e[2000005];
lsqxx h[1000005],cnt;
void add(lsqxx u,lsqxx v,lsqxx w)
{
	e[++cnt].to=v;e[cnt].w=w;e[cnt].nxt=h[u];h[u]=cnt;
}

int n,m,hi[1000005],x,y,z;
int dis[1000005],vis[1000005];
void dfs(int t)
{
	dis[t]=1;
	vis[t]=1;
	for(int i=h[t];i;i=e[i].nxt)
	{
		if(vis[e[i].to]) continue;
		dfs(e[i].to);
	}
}
struct l{
	int u,v,w;
}t[1000005];
int cntt;
bool cmp(l x,l y)
{
	if(hi[x.v]!=hi[y.v]) return hi[x.v]>hi[y.v];
	return x.w<y.w;
}
int f[1000005];
int getfa(int x)
{
	if(f[x]==x) return f[x];
	return f[x]=getfa(f[x]);
}
int cntan,ans;
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		scanf("%lld",&hi[i]);
	for(int i=1;i<=m;i++)
	{
		scanf("%lld%lld%lld",&x,&y,&z);
		if(hi[x]==hi[y])
			add(x,y,z),add(y,x,z);
		if(hi[x]>hi[y])
			add(x,y,z);
		if(hi[x]<hi[y])
			add(y,x,z);
	}
	dfs(1);
	for(int i=1;i<=n;i++)
		if(dis[i])
		{
			cntan++;
			for(int j=h[i];j;j=e[j].nxt)
				if(dis[e[j].to])
					t[++cntt].u=i,t[cntt].v=e[i].to,t[cntt].w=e[i].w;
		}
	sort(1+t,1+cntt+t,cmp);
	for(int i=1;i<=n;i++)
		f[i]=i;
	int hhh=0;
	for(int i=1;i<=cntt;i++)
	{
		int fu=getfa(t[i].u),fv=getfa(t[i].v);
		if(fu==fv) continue;
		f[fu]=fv;
		ans+=t[i].w;
		hhh++;
		if(hhh>=cntan-1)
			break;
	}
	printf("%lld %lld",cntan,ans);
    g;
}
2022/7/27 19:10
加载中...