Highways POJ-1751 最小生成树 Prim算法

题意

有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输出需要添加边的两端点编号即可。

解题思路

这个可以使用最短路里面的Prim算法来实现,对于已经连接的城市,处理方式是令这两个城市之间的距离等于0即可。

prim算法可以实现我们具体的路径输出,Kruskal算法暂时还不大会。

代码实现

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e3;
struct Node{int x, y;
}node[maxn];
int mp[maxn][maxn];
int vis[maxn];
int dis[maxn];//这里的dis存储的是其他各个点,到最小生成树中任意一点的最小值。
int line[maxn];
int n, m, ans=0;
void init()
{for(int i=1; i<=n; i++){dis[i]=mp[i][1];//开始的时候任选1号顶点加入到生成树中。这里是其他点到1号顶点的距离。line[i]=1; //默认没有加入到生成树的点距离生成树中最近距离的点是1;vis[i]=0; //默认没有点加入到生成树中。}
}
bool prim()
{ans=0;vis[1]=1;for(int i=1; i<n; i++){int tmp=inf, k;for(int j=1; j<=n; j++){if(!vis[j] && dis[j]<tmp){tmp=dis[j];k=j;}}if(tmp==inf) return false;//生成最小树失败,该图不是连通的。vis[k]=1;ans+=dis[k];if(mp[k][line[k]]!=0)//这里判断不为0,是因为有的路已经修好了,就不用输出了{printf("%d %d\n", k, line[k]); //输出需要链接的两个点}for(int j=1; j<=n; j++) //以新加入生成树的点作为中间点,看看能优化{if(!vis[j] && dis[j] > mp[j][k]){line[j]=k;dis[j]=mp[j][k];}}}return true;
}
int main()
{while(scanf("%d", &n)!=EOF){for(int i=1; i<=n; i++){scanf("%d%d", &node[i].x, &node[i].y);}for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){int tmp=(node[i].x-node[j].x)*(node[i].x-node[j].x)+(node[i].y-node[j].y)*(node[i].y-node[j].y);mp[i][j]=tmp;mp[j][i]=tmp;}}scanf("%d", &m);int x, y;for(int i=1; i<=m; i++){scanf("%d%d", &x, &y);mp[x][y]=mp[y][x]=0;}init();prim();}return  0;
}

转载于:https://www.cnblogs.com/alking1001/p/11600669.html

Highways POJ-1751 最小生成树 Prim算法相关推荐

  1. [Java学习] 最小生成树——Prim算法

    文章目录 最小生成树 Prim算法流程 应用实例 求最小生成树 最小生成树 百度百科上对于最小生成树的定义是这样的:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结 ...

  2. 最小生成树Prim算法Java版

    最小生成树Prim算法Java版 算法描述: 在一个加权连通图中,顶点集合V,边集合为E 任意选出一个点作为初始顶点,标记为visit,计算所有与之相连接的点的距离,选择距离最短的,标记visit. ...

  3. D-OJ刷题日记:使用邻接矩阵实现最小生成树Prim算法 题目编号:1135

    理解: [理解prim算法本质--让一棵小树逐渐长大] Prim算法:又称为加边法,即每次选择最小权值的边加入到生成树中,然后再更新权值,如此反复,保证每次最优来达到最优解. Prim算法生成树用的是 ...

  4. 西南科技大学OJ题 求最小生成树(Prim算法)1075

    求最小生成树(Prim算法) 1000(ms) 10000(kb) 2256 / 4495 Tags: 生成树 求出给定无向带权图的最小生成树.图的定点为字符型,权值为不超过100的整形.在提示中已经 ...

  5. 最小生成树-Prim算法详解(含全部代码)

    目录 适用条件 测试所用图 算法详解 Prim算法代码 全部代码 实验结果 适用条件 加权连通图 测试所用图 所用原图及生成过程 其中,(a) 为原图,圆圈里面是节点的名称,边上的数字是边的权值.由实 ...

  6. 最小生成树 - Prim算法

    最小生成树 - Prim算法 思路: 采用 贪心策略,每次选取连通块外延的最短边和对应的点放入连通块,再更新新的连通块外延的边.连通部分逐渐扩大,最后将整个图连通起来,并且边长之和最小. 时间复杂度: ...

  7. 【数据结构】最小生成树 Prim算法 Kruskal算法

    最小生成树应用场景: 假设以下场景,有一块木板,板上钉上一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通过一根或者多根细绳连接起来,那么一定存在这样得情况,即用最少的细绳把所有的钉子连接起 ...

  8. 生成树的概念,最小生成树Prim算法 Kruskal算法

    求解最小生成树可以用Prim算法 Kruskal算法

  9. POJ2728 Desert King ——01分数规划Dinkelbach迭代法+最小生成树prim算法

    首先,纪念我用Linux系统AC的第一题-   安装这个万恶的NOI Linux系统费了6小时的时间,不过好在最后终于装上了,但是因为我安装的Linux系统比较烂,还遭到了小花儿和js的鄙视,唉,本人 ...

  10. 图论(十)最小生成树-Prim算法

    前面说过,Prim算法是从顶点着手构建最小生成树的.应该说,Prim算法比Kruskal更简单.我们还是以前面的乡镇假设光纤网络为例: Prim算法工作步骤 (1) 构建全部顶点集V,选取初始顶点,加 ...

最新文章

  1. ISME:中科院微生物所揭示细菌利用光能新机制!
  2. MCMC+马尔科夫链蒙特卡罗
  3. IBM推出基于Watson的认知营销服务
  4. 【干货】Linux中实用但很小众的11个炫酷终端命令
  5. Extending_and_embedding_php翻译
  6. JSONP 初步学习--但是还是有疑问
  7. IP地址不是唯一的吗?为什么路由器的IP地址都是这样的呢?
  8. Python开发之:Django基于Docker实现Mysql数据库读写分离、集群、主从同步详解 | 原力计划...
  9. css hacks (ie6,ie7,ie8,firefox,Chrome)
  10. java解压zip包_Java中文件的压缩与解压,每天进步一点点系列
  11. uni-app的事件传参
  12. arduino点阵声音频谱_【紫歌のarduino笔记】基于FFT的音乐频谱显示器
  13. Centos7 安装Oracle JDK1.8和OpenJDK 1.8
  14. mac composer 安装
  15. 解析ip数据包java_ip包,ip数据包,数据包或者包的理解
  16. 科学家预测:未来100万年人类将变成半机械人类
  17. php smarty 模板注释,smarty中的注释
  18. FeHelper插件安装小结
  19. spring nature
  20. 数据基础-索引和完整性(约束)

热门文章

  1. ue4是什么意思_UE4 C++基础教程 - 资源常见名词解释
  2. 线上问题:大事务问题
  3. hashCode()和equals()的若干问题
  4. 不要打开文件,阅读Rvt信息档案
  5. Java基础算法--排序
  6. mysql二进制日志管理
  7. RPM + yum 完美完装tomcat
  8. oracle Fusion Applications 简介 (Oracle融合管理软件简介)
  9. ubuntu13.10 归档管理器解压zip文件中文乱码问题的解决(亲测成功)
  10. BZOJ1911[APIO2010] 特别行动队