N - 畅通工程再续 - hdu 1875
生活随笔
收集整理的這篇文章主要介紹了
N - 畅通工程再续 - hdu 1875
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Description
相信大家都聽(tīng)說(shuō)一個(gè)“百島湖”的地方吧,百島湖的居民生活在不同的小島中,當(dāng)他們想去其他的小島時(shí)都要通過(guò)劃小船來(lái)實(shí)現(xiàn)。現(xiàn)在政府決定大力發(fā)展百島湖,發(fā)展首先要解決的問(wèn)題當(dāng)然是交通問(wèn)題,政府決定實(shí)現(xiàn)百島湖的全暢通!經(jīng)過(guò)考察小組RPRush對(duì)百島湖的情況充分了解后,決定在符合條件的小島間建上橋,所謂符合條件,就是2個(gè)小島之間的距離不能小于10米,也不能大于1000米。當(dāng)然,為了節(jié)省資金,只要求實(shí)現(xiàn)任意2個(gè)小島之間有路通即可。其中橋的價(jià)格為 100元/米。Input
輸入包括多組數(shù)據(jù)。輸入首先包括一個(gè)整數(shù)T(T <= 200),代表有T組數(shù)據(jù)。?每組數(shù)據(jù)首先是一個(gè)整數(shù)C(C <= 100),代表小島的個(gè)數(shù),接下來(lái)是C組坐標(biāo),代表每個(gè)小島的坐標(biāo),這些坐標(biāo)都是 0 <= x, y <= 1000的整數(shù)。?
Output
每組輸入數(shù)據(jù)輸出一行,代表建橋的最小花費(fèi),結(jié)果保留一位小數(shù)。如果無(wú)法實(shí)現(xiàn)工程以達(dá)到全部暢通,輸出”oh!”.Sample Input
2 2 10 10 20 20 3 1 1 2 2 1000 1000Sample Output
1414.2 oh!分析:看題意可以明白只要在任意個(gè)合法的橋之間加上邊,進(jìn)行最小生成樹(shù)求解即可,注意要判斷無(wú)法構(gòu)成生成樹(shù)的情況。************************************注意:不能用int提高精度判定,只能使用double..要不就會(huì)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)//求兩個(gè)小島的距離,不合法返回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;?
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/liuxin13/p/4676170.html
總結(jié)
以上是生活随笔為你收集整理的N - 畅通工程再续 - hdu 1875的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 天龙八部峨眉怎么堆血
- 下一篇: VS2010调试时,对于一些语句不能单步