這個題首先要把輸入的坐標轉化成鄰接矩陣的形式。之后再利用鄰接矩陣使用普里姆算法計算最小生成樹。并對其中的邊進行排序。找出減去S個較大的后最大的那一個。因為較大的那幾個可以用衛星傳輸
#include<iostream>
#include<cmath>
#include<algorithm>
#include<stdio.h>
using namespace std;
typedef struct
{
double x;
double y;
}point;
point array[505];
double len[505][505];
double kk[505],next[505];
double re[505];
int sa,num;
double dis(point first,point second)
{
return sqrt((first.x-second.x)*(first.x-second.x)+(first.y-second.y)*(first.y-second.y));
}
void prim(int n)
{
int i,j;
//////////讀入數據完畢。開始構建鄰接矩陣
for(i=0;i<num;i++)
{
for(j=0;j<num;j++)
{
len[i][j]=15000000;
}
}
for(i=0;i<num;i++)
{
for(j=0;j<num;j++)
{
if(i!=j)
len[i][j]=dis(array[i],array[j]);
}
}
for(i=0;i<num;i++)
{
kk[i]=len[0][i];
next[i]=0;
}
/////////鄰接矩陣構建完畢
int count=0;i=0;
while(count<num-1)
{
if(next[i]!=-1)
{
for(j=0;j<num;j++)
{
if(i!=j&&next[j]!=-1)
{
if(len[i][j]<kk[j])
{
kk[j]=len[i][j];
next[j]=i;
}
}
}
next[i]=-1;
double max=999999999;int k;
for(j=0;j<num;j++)
{
if(kk[j]<max&&next[j]!=-1)
{
k=j;
max=kk[j];
}
}
re[count]=max;
i=k;
count++;
}
}
}
int main()
{
int n;
cin>>n;
int i;
while(n--)
{
cin>>sa>>num;
for( i=0;i<num;i++)
{
scanf("%lf%lf",&array[i].x,&array[i].y);
}
prim(0);
sort(re,re+num-1);
printf("%.2f\n",re[num-1-sa]);
}
return 0;
}
只有注冊用戶登錄后才能發表評論。 | ||
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
![]() |
||
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
27 | 28 | 29 | 30 | 31 | 1 | 2 | |||
3 | 4 | 5 | 6 | 7 | 8 | 9 | |||
10 | 11 | 12 | 13 | 14 | 15 | 16 | |||
17 | 18 | 19 | 20 | 21 | 22 | 23 | |||
24 | 25 | 26 | 27 | 28 | 29 | 30 | |||
31 | 1 | 2 | 3 | 4 | 5 | 6 |
常用鏈接
留言簿(1)
隨筆分類
隨筆檔案
文章分類
文章檔案
搜索
最新評論

- 1.?re: 硬幣找錢問題[未登錄]
-
搜著搜著居然找到這兒了,MARK。
崔,用DP寫了沒? - --Shane
- 2.?re: 硬幣找錢問題
- 評論內容較長,點擊標題查看
- --崔佳星
- 3.?re: 硬幣找錢問題
- 評論內容較長,點擊標題查看
- --崔佳星
- 4.?re: 硬幣找錢問題
- 已經修改了,可以過全部數據!!!!!
- --崔佳星
- 5.?re: 硬幣找錢問題
- 以上算法沒有考慮一種情況,就是剩余幣值不足以支付。
- --崔佳星