题目链接 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 }
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/245456.html