社区讨论

Kruskal 40分求助,玄关

P2504[HAOI2006] 聪明的猴子参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m00xksxk
此快照首次捕获于
2024/08/19 19:46
2 年前
此快照最后确认于
2024/08/19 21:39
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int chin[505],m,n,k=0,ltk,fa[1000006];
double ans;
struct T{
	int x,y;
}t[1005];
struct edge{
	int u,v;
	double w;
}e[1000006];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
bool cmp(edge a,edge b){return a.w<b.w;};
bool cmp2(int a,int b){
	return a>b;
}
double getdis(double x,double y,double xx,double yy){
	return sqrt((abs(x-xx))*(abs(x-xx))+(abs(y-yy))*(abs(y-yy)));
}
void add(int a,int b,double c){
	e[k].u=a,e[k].v=b,e[k++].w=c;
}
int main(){
	cin>>m;ltk=m;
	for(int i=0;i<m;i++)cin>>chin[i];
	cin>>n;
	for(int i=0;i<n;i++)fa[i]=i;
	for(int i=0;i<n;i++)cin>>t[i].x>>t[i].y;
	for(int i=0;i<n;i++){
		for(int j=i+1;j<n;j++){
			double K=getdis(t[i].x*1.0,t[i].y*1.0,t[j].x*1.0,t[j].y*1.0);
			add(i,j,K);
		}
	}
	//
	//for(int i=0;i<k;i++)cout<<e[i].w<<endl;
	//
	sort(e,e+k,cmp);
    for(int i=0;i<k;i++){
    	int u=find(e[i].u),v=find(e[i].v);
        if(u!=v){
            ans=e[i].w,fa[v]=u,ltk--;
        }
        if(ltk==1)break;
    }
	int anss=0;
	for(int i=0;i<m;i++){
		if(chin[i]>=ans)anss++;
	}
	cout<<anss;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...