79pts在线悬关求调
  • 板块P1194 买礼物
  • 楼主XYY62012
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/11/24 11:37
  • 上次更新2024/11/24 14:11:34
查看原帖
79pts在线悬关求调
1108111
XYY62012楼主2024/11/24 11:37

看半天没发现问题 马上就下线了 上线后再给关注

#include<bits/stdc++.h>
using namespace std;
const int MAXN=6000;
int a,b;
int cnt,tot,ans;
int father[MAXN];
struct Edge{
	int x;
	int y;
	int w;
}f[MAXN];
bool cmp(Edge a,Edge b){//sort排序规则,按费用从低到高排序
	return a.w<b.w;
}
void add(int m,int n,int p){
	cnt++;
	f[cnt].x=m;
	f[cnt].y=n;
	f[cnt].w=p;
}
int fath(int v){
	if(father[v]!=v) father[v]=fath(father[v]);
	return father[v];
}
void unionn(int u,int v){
	int fa=fath(u);
	int fb=fath(v);
	if(fa!=fb) father[fa]=fb;
}
int main(){
	int k;
	cin>>a>>b;
	for(int i=1;i<=b;i++){
		for(int j=1;j<=b;j++){
			cin>>k;
			if(i<j && k!=0){
				add(i,j,k);
			}
		}
	}
	for(int i=1;i<=b;i++){//初始化
		father[i]=i;
	}
	for(int i=1;i<=b;i++){
		add(0,i,a);
	}
	sort(f+1,f+1+cnt,cmp);
	for(int i=1;i<=cnt;i++){
		if(fath(f[i].x)!=fath(f[i].y)){
			unionn(f[i].x,f[i].y);
			ans+=f[i].w;
			tot++;
		}
		if(tot>=cnt){
			break;
		}
	}
	cout<<ans<<endl;
	return 0;
}
2024/11/24 11:37
加载中...