N - 畅通工程再续 - hdu 1875
生活随笔
收集整理的這篇文章主要介紹了
N - 畅通工程再续 - hdu 1875
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
相信大家都聽說一個“百島湖”的地方吧,百島湖的居民生活在不同的小島中,當他們想去其他的小島時都要通過劃小船來實現。現在政府決定大力發展百島湖,發展首先要解決的問題當然是交通問題,政府決定實現百島湖的全暢通!經過考察小組RPRush對百島湖的情況充分了解后,決定在符合條件的小島間建上橋,所謂符合條件,就是2個小島之間的距離不能小于10米,也不能大于1000米。當然,為了節省資金,只要求實現任意2個小島之間有路通即可。其中橋的價格為 100元/米。Input
輸入包括多組數據。輸入首先包括一個整數T(T <= 200),代表有T組數據。?每組數據首先是一個整數C(C <= 100),代表小島的個數,接下來是C組坐標,代表每個小島的坐標,這些坐標都是 0 <= x, y <= 1000的整數。?
Output
每組輸入數據輸出一行,代表建橋的最小花費,結果保留一位小數。如果無法實現工程以達到全部暢通,輸出”oh!”.Sample Input
2 2 10 10 20 20 3 1 1 2 2 1000 1000Sample Output
1414.2 oh!分析:看題意可以明白只要在任意個合法的橋之間加上邊,進行最小生成樹求解即可,注意要判斷無法構成生成樹的情況。************************************注意:不能用int提高精度判定,只能使用double..要不就會WA#include<algorithm>#include<stdio.h>
#include<string.h>
#include<queue>
#include<math.h>
using?namespace?std;
const?int?maxn?=?105;
const?double?oo?=?0x7fffffff;
double?G[maxn][maxn];
struct?point{int?x,?y;}p[maxn];
double?Len(point?a,?point?b)//求兩個小島的距離,不合法返回oo
{
????int?x?=?a.x-b.x;
????int?y?=?a.y-b.y;
????double?l?=?sqrt(x*x?+?y*y);
????if(l>=10.0?&&?l<=1000.0)
????????return?l;//合法范圍
????return?oo;
}
double?Prim(int?N)
{
????int?vis[maxn]={0,?1};
????int?i,?T?=?N-1;
????double?dist[maxn],?ans?=?0;
????for(i=1;?i<=N;?i++)
????????dist[i]?=?G[1][i];
????while(T--)
????{
????????int?k?=?-1;
????????double?mini?=?oo;
????????for(i=1;?i<=N;?i++)
????????{
????????????if(!vis[i]?&&?mini?>?dist[i])
????????????????mini?=?dist[i],?k=i;
????????}
????????if(k?==?-1)return?-1;
????????vis[k]?=?true,?ans?+=?mini;
????????for(i=1;?i<=N;?i++)if(!vis[i])
????????????dist[i]?=?min(dist[i],?G[k][i]);
????}
????return?ans;
}
int?main()
{
????int?T;
????scanf("%d",?&T);
????while(T--)
????{
????????int?i,?j,?N;
????????scanf("%d",?&N);
????????for(i=1;?i<=N;?i++)
????????????scanf("%d%d",?&p[i].x,?&p[i].y);
????????for(i=1;?i<=N;?i++)
????????for(j=i;?j<=N;?j++)
????????{
????????????if(j?==?i)G[i][j]?=?0.0;
????????????else?G[i][j]?=?G[j][i]?=?Len(p[i],?p[j]);
????????}
????????double?ans?=?Prim(N);
????????if(ans?<?0)
????????????printf("oh!\n");
????????else
????????????printf("%.1f\n",?ans*100?);
????}
????return?0;?
}
?
轉載于:https://www.cnblogs.com/liuxin13/p/4676170.html
總結
以上是生活随笔為你收集整理的N - 畅通工程再续 - hdu 1875的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天龙八部峨眉怎么堆血
- 下一篇: Windows忘记BIOS密码/操作系统