【玄关】kruskal求条
查看原帖
【玄关】kruskal求条
592751
xiaoke2021楼主2024/6/8 16:31

样例都没过,实在不知道错哪儿了。

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct edge{
	int from,to,nxt,val;
};
int n,m;
int h[100000+5];
int u,v,k;
edge e[2000000+5],e2[2000000+5];
int cnt,cnt2;
int head[100000+5],head2[100000+5];
bool vis[2000000+5];
int f[100000+5];
int ans;
void add(edge t[],int hd[],int a,int b,int c,int &pos){
	pos++;
	t[pos].from=a;
	t[pos].to=b;
	t[pos].val=c;
	t[pos].nxt=hd[a];
	hd[a]=pos;
}
bool cmp(edge a,edge b){
	if(h[a.to]!=h[b.to]) return h[a.to]>h[b.to];
	return a.val<b.val;
}
int find(int k){
	if(k!=f[k]) f[k]=find(f[k]);
	return f[k];
}
void dfs(int k){
	vis[k]=true;
	for(int i=head[k];i;i=e[i].nxt){
		if(!vis[i]){
			add(e2,head2,e[i].from,e[i].to,e[i].val,cnt2);
			dfs(e[i].to);
		}
	}
}
void kruskal(){
	for(int i=1;i<=n;i++) f[i]=i;
	sort(e2+1,e2+1+cnt2,cmp);
	for(int i=1;i<=cnt2;i++){
		int fu=find(e2[i].from),fv=find(e2[i].to);
		if(fu==fv) continue;
		ans+=e2[i].val;
		f[fu]=fv;
	}
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>h[i];
	for(int i=1;i<=m;i++){
		cin>>u>>v>>k;
		if(h[u]>=h[v]) add(e,head,u,v,k,cnt);
		if(h[v]>=h[u]) add(e,head,v,u,k,cnt);
	}dfs(1);
	kruskal();
	cout<<cnt2+1<<" "<<ans;
	return 0;
}
2024/6/8 16:31
加载中...