社区讨论
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 条回复,欢迎继续交流。
正在加载回复...