BZOJ P1821[JSOI2010]Group部落划分

来源:互联网 发布:centos 安装openjdk 编辑:程序博客网 时间:2024/05/24 02:36

直接贪心

要求最短的距离最长

就让尽量短的连在一起,然后按边长度排序之后类似于kruscal就可以了

#include<iostream>#include<fstream>#include<algorithm>#include<cmath>#include<cstring>using namespace std;int n,k,cnt;int x[1003],y[1003],father[1003];struct data{int x,y;double v;}e[1000003];inline bool cmp(data a,data b){return a.v<b.v;}void ins(int a,int b){double s=sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));e[++cnt].x=a;e[cnt].y=b;e[cnt].v=s;}int find(int x){if(x==father[x]){x;}else{father[x]=find(father[x]);}}int main(){cin>>n>>k;for(int i=1;i<=n;i++){cin>>x[i]>>y[i];}for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){ins(i,j);}}sort(e+1,e+cnt+1,cmp);for(int i=1;i<=n;i++){father[i]=i;}for(int i=1;i<=cnt;i++){int fax=find(e[i].x),fay=find(e[i].y);if(fax!=fay){if(n>k){n--;father[fax]=find[e[i]-.y];}else{cout<<fixed<<setprecition(2)<<e[i].v<<endl;}}}return 0;}


0 0
原创粉丝点击