题目链接 https://www.luogu.com.cn/problem/P2872
谢谢,我真的会哭。。。。。我以为敲一遍的模板题而已。。。。(它就是!)又WA了好多遍还找不到错误。。。
第一个错误点:第20行没有用double把z传进来
第二个:29行两条边也要用double算
放AC代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5000100; 4 int n,m;//点、边d 5 int cnt;//计数 6 int sum;//记录边数 7 double ans;//输出和 8 int fa[N];//保存父节点 9 struct Point 10 {//点的信息 11 int x,y; 12 }point[N]; 13 14 struct Edge 15 {//边的信息 16 int u,v; 17 double w; 18 }edge[N]; 19 20 void add(int u,int v,double z) 21 {//添加边 22 edge[++cnt].u=u; 23 edge[cnt].v=v; 24 edge[cnt].w=z; 25 } 26 27 double distance(int x,int y) 28 {//计算距离 29 return (double)(sqrt((double)(point[x].x-point[y].x)*(point[x].x-point[y].x)+(double)(point[x].y-point[y].y)*(point[x].y-point[y].y))); 30 } 31 32 bool cmp(Edge a,Edge b) 33 {//排序 34 if(a.w==b.w) return a.u<b.u; 35 return a.w<b.w; 36 } 37 38 int find(int o) 39 {//找根节点 40 return fa[o]==o?o:fa[o]=find(fa[o]); 41 } 42 43 int main() 44 { 45 cin>>n>>m; 46 for(int i=1;i<=n;i++) 47 {//输入点的信息 48 cin>>point[i].x>>point[i].y; 49 } 50 for(int i=1;i<=n;i++) 51 {//初始化根节点 52 fa[i]=i; 53 } 54 for(int i=1;i<=n;i++) 55 {//枚举计算上三角形相邻点的距离 56 for(int j=i+1;j<=n;j++) 57 { 58 double z=distance(i,j); 59 add(i,j,z); 60 } 61 } 62 for(int i=1;i<=m;i++) 63 {//输入已知边的信息并将其权值初始化为0 64 int u,v; 65 cin>>u>>v; 66 add(u,v,0.0); 67 } 68 //按照边的权值排序 69 sort(edge+1,edge+cnt+1,cmp); 70 for(int i=1;i<=cnt;i++) 71 { 72 int x_root=find(edge[i].u); 73 int y_root=find(edge[i].v); 74 if(x_root!=y_root) 75 { 76 fa[x_root]=y_root; 77 sum++; 78 ans+=edge[i].w; 79 } 80 if(sum==n-1) 81 break; 82 } 83 printf("%.2lf",ans); 84 return 0; 85 }