BZOJ1821 [JSOI2010]Group 部落劃分 Group Kruscal

來源:互聯網
上載者:User

標籤:sqrt   i+1   答案   ret   php   html   online   name   lib   

歡迎訪問~原文出處——部落格園-zhouzhendong去部落格園看該題解題目傳送門 - BZOJ1821題意概括

  平面上有n個點,現在把他們劃分成k個部分,求不同部分之間最近距離的最大值。

  兩個部分的距離就是兩個部分中的最近的點對的距離。

   n<=1000

 

題解

  我們把所有的點全部建邊。

  然後我們要更新答案,就要盡量弄掉短的邊。

  於是就按照kruscal那樣從短的開始弄。

  當然要用並查集。

  最後答案就是剩餘的有意義的邊中最短的一條。

  注意最後的處理,我由於這個wa了好多次。

 

代碼
#include <cstring>#include <algorithm>#include <cstdio>#include <cstdlib>#include <cmath>using namespace std;const int N=1000+5,M=N*N;int n,k,fa[N];struct Point{int x,y;}p[N];int sqr(int x){return x*x;}struct Edge{int a,b,c;}e[M];bool cmp(Edge a,Edge b){return a.c<b.c;}int getf(int k){return fa[k]==k?k:fa[k]=getf(fa[k]);}int main(){scanf("%d%d",&n,&k);for (int i=1;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y);int cnt=0;for (int i=1;i<=n;i++)for (int j=i+1;j<=n;j++){e[++cnt].a=i,e[cnt].b=j;e[cnt].c=sqr(p[i].x-p[j].x)+sqr(p[i].y-p[j].y);}sort(e+1,e+cnt+1,cmp);int tot=0;for (int i=1;i<=n;i++)fa[i]=i;int i;for (i=1;i<=cnt&&n-tot>k;i++){int a=e[i].a,b=e[i].b;if (getf(a)==getf(b))continue;fa[getf(a)]=getf(b);tot++;}for (;i<=cnt&&getf(e[i].a)==getf(e[i].b);i++);printf("%.2lf",sqrt(e[i].c));return 0;}

  

BZOJ1821 [JSOI2010]Group 部落劃分 Group Kruscal

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.