最小生成树模版题Prim——修建道路

题目描述

Farmer John最近得到了一些新的农场,他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达(也就是说,从任一个农场都可以经过一些首尾相连道路到达剩下的所有农场)。有些农场之间原本就有道路相连。

所有N(1 <= N <= 1,000)个农场(用1..N顺次编号)在地图上都表示为坐标为(X_i, Y_i)的点(0 <= X_i <= 1,000,000;0 <= Y_i <= 1,000,000),两个农场间道路的长度自然就是代表它们的点之间的距离。现在Farmer John也告诉了你农场间原有的M(1 <= M <= 1,000)条路分别连接了哪两个农场,他希望你计算一下,为了使得所有农场连通,他所需建造道路的最小总长是多少。

输入格式

第1行: 2个用空格隔开的整数:N 和 M

  • 第2..N+1行: 第i+1行为2个用空格隔开的整数:X_i、Y_i

  • 第N+2..N+M+2行: 每行用2个以空格隔开的整数i、j描述了一条已有的道路, 这条道路连接了农场i和农场j

输出格式

第1行: 输出使所有农场连通所需建设道路的最小总长,保留2位小数,不必做任何额外的取整操作。为了避免精度误差,计算农场间距离及答案时请使用64位实型变量(double)

input

4 1
1 1
3 1
2 3
4 3
1 4

输入说明:

    FJ一共有4个坐标分别为(1,1),(3,1),(2,3),(4,3)的农场。农场1和农场
4之间原本就有道路相连。

output

4.00

输出说明:

    FJ选择在农场1和农场2间建一条长度为2.00的道路,在农场3和农场4间建一
条长度为2.00的道路。这样,所建道路的总长为4.00,并且这是所有方案中道路
总长最小的一种。

数据规模与约定

时间限制:1s

空间限制:256MB

思路:众所周知,两点之间直线最短,再根据题目,所建的路都是任意两点之间的直线,显然就可以构建出一个稠密图,题所要求的结果,就是该稠密图的最小生成树。同时,已有m条路径存在,相当与这些路径的长度(代价/权值)为0,then 非常简单可以解决问题。

注意事项:由于需要用到double 在处理数据的时候就要————————————————————————

我那60分的代码就是一个死翘翘的~~~~

#include<bits/stdc++.h> using namespace std; const int maxm=1212;//虾皮操作 int n,m; struct b { int x,y;//注意注意注意放火了 }e[maxm]; double a[maxm][maxm],dis[maxm],ans; bool f[maxm]; double gj(int xx,int yy)//两点之间的距离 { return sqrt((e[xx].x-e[yy].x)*(e[xx].x-e[yy].x)+(e[xx].y-e[yy].y)*(e[xx].y-e[yy].y)); } void init()//乱读 (这是个好东西) { cin>>n>>m; for(int i=1;i<=n;i++) cin>>e[i].x>>e[i].y; for(int i=1;i<=m;i++) { int x,y; cin>>x>>y; a[x][y]=a[y][x]=1; } } void prim()//核心代码 { for(int i=0;i<=n;i++) dis[i]=1000000000;//初始化 memset(f,false,sizeof(f)); f[1]=1;dis[1]=0; for(int i=2;i<=n;i++) { int s=i; if(a[1][s]==1) dis[s]=0; else dis[s]=gj(1,s); } for(int i=1;i<n;i++) { int k=0; double minn=dis[0]; for(int j=1;j<=n;j++) if(!f[j]&&dis[j]<minn) minn=dis[j],k=j; f[k]=1; ans=ans+dis[k]; for(int j=1;j<=n;j++) { if(!f[j]) { if(a[k][j]==1) dis[j]=0; else if(gj(k,j)<dis[j]) dis[j]=gj(k,j); } } } }

这真代码理论上是正确的,死就死在e数组里的  int x,y;  上;

AC代码

struct b { double x,y; }e[maxm];

然后就
GG



    原文作者:道路修建问题
    原文地址: https://blog.csdn.net/jn737582209/article/details/78761375
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞