首页 > 学院 > 开发设计 > 正文

文章标题

2019-11-11 05:12:37
字体:
来源:转载
供稿:网友

相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组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 1000 Sample Output 1414.2 oh!

两种做法,dijk最短路,d[i]求得是存的是上一个点到i点的最短距离。可以用最小生成树做。如果加入的点少于n-1,证明oh。 最小生成树比较简单。 dijk的代码

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int maxn = 101000;#define inf 0x3f3f3f3fstruct node{ int x,y;}dao[maxn];double d[maxn];int vis[maxn];int n,m;double e[1010][1010];double dis(node a,node b){ double dis2 = sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y)); if(dis2>=10.0&&dis2<=1000.0) { return dis2; } else return inf;}void dijk(int x){ memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { d[i]=e[x][i]; } d[x]=0; vis[x]=1; double ans=0; int mini=0; for(int i=0;i<n-1;i++) { double minn=inf; for(int j=0;j<n;j++) { if(d[j]<minn&&!vis[j]) { minn=d[j]; mini=j; } } if(minn==inf) { printf("oh!/n"); return ; } ans+=minn; vis[mini]=1; for(int k=0;k<n;k++) { if(!vis[k]&&e[mini][k]<d[k]) { d[k]=e[mini][k]; } } } printf("%.1lf/n",ans*100 );}int main(){ int t; cin>>t; while(t--) { cin>>n; for(int i=0;i<n;i++) { int x,y; cin>>x>>y; dao[i].x=x; dao[i].y=y; } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { e[i][j]=dis(dao[i],dao[j]); } } dijk(0); }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表