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 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具