离谱60分求调(谢
查看原帖
离谱60分求调(谢
502702
ABookCD楼主2022/5/11 09:52
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e6+20;
const int maxn=2e6+10;
int height[maxn];
struct edge{
	int next, v, w;
}E[maxm];
int p[maxn];
void init(){
	for(int i=1;i<maxn;i++){
		p[i]=-1;
	} 
}
int cnt;
struct node{
	int x,y,z;
}pp[maxm];
int father[maxn];
void initd(){
	for(int i=0;i<maxn;i++){
		father[i]=i;
	}
}
int fa(int x){
	if(x==father[x]) return x;
	father[x]=fa(father[x]);
	return father[x];
}
int n,m;
int cntt;
int kruskal(){
	int ans=0;
	for(int i=1;i<=cntt;i++){
	//	cout<<ans<<" "<<u<<" "<<v<<endl;
		int uu=fa(pp[i].x);
		int vv=fa(pp[i].y);
		if(uu!=vv){
			father[uu]=vv;
			ans+=pp[i].z;
			if(--n<2) break;
		}
	}
	return ans;
}
bool cmp1(node x,node y) {
    if(height[x.y]!=height[y.y]) return height[x.y]>height[y.y];
    return x.z<y.z;
}
void ae(int u,int v,int w){
	E[cnt].v=v;
	E[cnt].w=w;
	E[cnt].next=p[u];
	p[u]=cnt++;
}

bool vis[maxn];
queue<int> q;
int ans1;

void dfs(int x){
	if(vis[x]) return;
	vis[x]=true;
	ans1++;
	for(int i=p[x];i!=-1;i=E[i].next){
		pp[cntt].x=x;
		pp[cntt].y=E[i].v;
		pp[cntt].z=E[i].w;
		cntt++;
		if(!vis[E[i].v]) dfs(E[i].v);
	}
}
signed main(){
	init();
	initd();
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>height[i];
	for(int i=1;i<=m;i++){
		int uu,vv,kk;
		cin>>uu>>vv>>kk;
		if(height[uu]>=height[vv]) ae(uu,vv,kk);
		if(height[vv]>=height[uu]) ae(vv,uu,kk);
	}
	dfs(1);
	cout<<ans1<<" ";
	sort(pp+1,pp+cntt+1,cmp1);
	cout<<kruskal();
}

马蜂正常,谢谢各位啦

2022/5/11 09:52
加载中...