題目描述
國防部計劃用無線網路連線若干個邊防哨所。2 種不同的通訊技術用來搭建無線網路;
每個邊防哨所都要配備無線電收發器;有一些哨所還可以增配衛星電話。
任意兩個配備了一條衛星電話線路的哨所(兩邊都ᤕ有衛星電話)均可以通話,無論
他們相距多遠。而只通過無線電收發器通話的哨所之間的距離不能超過 D,這是受收發器
的功率限制。收發器的功率越高,通話距離 D 會更遠,但同時價格也會更貴。
收發器需要統一購買和安裝,所以全部哨所只能選擇安裝一種型號的收發器。換句話
說,每一對哨所之間的通話距離都是同一個 D。你的任務是確定收發器必須的最小通話距
離 D,使得每一對哨所之間至少有一條通話路徑(直接的或者間接的)。
輸入輸出格式
輸入格式:從 wireless.in 中輸入資料第 1 行,2 個整數 S 和 P,S 表示可安裝的衛星電話的哨所
數,P 表示邊防哨所的數量。接下里 P 行,每行兩個整數 x,y 描述一個哨所的平面座標
(x, y),以 km 為單位。
輸出格式:輸出 wireless.out 中
第 1 行,1 個實數 D,表示無線電收發器的最小傳輸距離,㋮確到小數點後兩位。
輸入輸出樣例
輸入樣例#1:
2 4 0 100 0 300 0 600 150 750
輸出樣例#1:
212.13
說明
附送樣例一個
對於 20% 的資料:P = 2,S = 1
對於另外 20% 的資料:P = 4,S = 2
對於 100% 的資料保證:1 ≤ S ≤ 100,S < P ≤ 500,0 ≤ x,y ≤ 10000。
預處理距離,
然後跑kruskal
一開始以為自己陣列開小了。。
結果仔細檢查了一下才發現是kruskal寫錯了一個地方
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<cstdlib> 6 #include<algorithm> 7 using namespace std; 8 const int MAXN=1000001; 9 void read(int & n) 10 { 11 char c='+';int x=0; 12 while(c<'0'||c>'9')c=getchar(); 13 while(c>='0'&&c<='9') 14 x=x*10+(c-48),c=getchar(); 15 n=x; 16 } 17 int p,n; 18 double far[1001][1001]; 19 int heng[MAXN],zong[MAXN]; 20 void calc() 21 { 22 for(int i=1;i<=n;i++) 23 for(int j=1;j<=n;j++) 24 { 25 if(i==j) 26 far[i][j]=0; 27 else 28 far[i][j]=(double)sqrt((double)(abs(heng[i]-heng[j])*abs(heng[i]-heng[j]))+(double)(abs(zong[i]-zong[j])*abs(zong[i]-zong[j]))); 29 } 30 } 31 32 struct node 33 { 34 int u,v; 35 double w; 36 }edge[1000001]; 37 int num=1; 38 void add_edge(int x,int y,double z) 39 { 40 edge[num].u=x; 41 edge[num].v=y; 42 edge[num].w=z; 43 num++; 44 } 45 int comp(const node & a ,const node & b) 46 { 47 return a.w<b.w; 48 } 49 int fa[1000001]; 50 int find(int x) 51 { 52 if(fa[x]==x) 53 return fa[x]; 54 return fa[x]=find(fa[x]); 55 } 56 void unionn(int x,int y) 57 { 58 int fx=find(x); 59 int fy=find(y); 60 fa[fx]=fy; 61 } 62 void kruskal() 63 { 64 int tot=0;double ans=-1; 65 sort(edge+1,edge+num,comp); 66 for(int i=1;i<=num-1;i++) 67 { 68 if(edge[i].u!=0&&edge[i].v!=0&&find(edge[i].u)!=find(edge[i].v)) 69 { 70 unionn(edge[i].u,edge[i].v); 71 tot++; 72 ans=max(ans,edge[i].w); 73 } 74 if(tot==n-p) 75 break; 76 } 77 printf("%.2lf",ans); 78 } 79 int main() 80 { 81 read(p);read(n); 82 for(int i=0;i<=n;i++) 83 fa[i]=i; 84 for(int i=1;i<=n;i++) 85 { 86 read(heng[i]); 87 read(zong[i]); 88 } 89 calc(); 90 for(int i=1;i<=n;i++) 91 for(int j=1;j<=n;j++) 92 add_edge(i,j,far[i][j]); 93 kruskal(); 94 return 0; 95 }