P2872Building Roads S

一、题目描述

  

 

 二、解题思路

  首先把这些点的距离预处理出来,然后把给定的边的权值设置为0。那么这些给定的边一定会被走到,然后根据短的再进行选就行了,因此可以用prim算法来做这个题,当然可以用堆优化,但是数据量比较小,所以就没有用堆优化了。(这里很容易出错,debug两个小时在一个double型的mn上,我哭了。。。)

三、代码实现

复制代码
 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 int n,m;
 4 int a[1010];
 5 struct node{
 6     double x;
 7     double y;
 8 }c[1010];
 9 double graph[1010][1010];
10 double dis[1010];
11 int vis[1010];
12 const int inf = 1e9;
13 void prim()
14 {
15     vis[1] = 1;
16     for(int i = 1;i <= n;i++)
17         dis[i] = graph[1][i];
18     double mn;
19     int k;
20     double ans = 0;
21     for(int i = 2;i <= n;i++){
22         mn = inf;
23         k = -1;
24         for(int j = 1;j <= n;j++){
25             if(!vis[j] && dis[j] < mn)
26                 mn = dis[j],k = j;
27         }
28         ans += mn;
29         vis[k] = 1;
30         for(int j = 1;j <= n;j++)
31             if(!vis[j] && dis[j] > graph[k][j])
32                 dis[j] = graph[k][j];
33     }
34     printf("%.2lf",ans);
35 }
36 int main()
37 {
38     cin >> n >> m;
39     for(int i = 1;i <= n;i++)
40         dis[i]  = inf;
41     for(int i = 1;i <= n;i++){
42         cin >> c[i].x >> c[i].y;
43         for(int j = 1;j < i;j++){
44             graph[i][j] = sqrt(pow(double(c[i].x - c[j].x),2) + pow(double(c[i].y - c[j].y),2));
45             graph[j][i] = sqrt(pow(double(c[i].x - c[j].x),2) + pow(double(c[i].y - c[j].y),2));
46         }
47     }
48     for(int i = 1;i <= m;i++){
49         int u,v;
50         cin >> u >> v;
51         graph[u][v] = 0;
52         graph[v][u] = 0;
53     }
54     prim();
55     return 0;
56 }
复制代码
posted @   scannerkk  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示