博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法学习之路|最小生成树——prime算法
阅读量:6847 次
发布时间:2019-06-26

本文共 1475 字,大约阅读时间需要 4 分钟。

算法概述:对于一个带权的连通图,其顶点的集合 为V,边的集合为E。定义一个新的集合Vnew={空},第一步在图中任选一个顶点v加入Vnew,第二步寻找最短的边(u,v),其中u∈Vnew,v∈V-Vnew,其中v加入Vnew,循环执行第二步直到Vnew=V结束。

void prime(){  int i,j;  int min=INF;  for(i=1;i
lowcost[j]) { min=lowcost[j]; k=j; } } vnew[k]=1; for(j=1;j<=n;i++) { if(!vnew[j]&&map[k][j]

题目大意:n个城市,知道各个城市的距离,建路将n个城市互相可达,路是直线建的,max=各个城市最长的那条路,求所有建路方案中max的最小值。

解题思路:直接prime求最小生成树

代码(已ac)

#include
#include
#include
#define N 510#define INF 0x3f3f3f3fusing namespace std;int _map[N][N];int Vnew[N];int lowcost[N];int prime(int n){ int i,j; int _min; int ans=-1; for(i=1;i<=n;i++) lowcost[i]=INF; lowcost[1]=0; memset(Vnew,0,sizeof(Vnew)); for(i=1;i<=n;i++) { int k; _min=INF; for(j=1;j<=n;j++) { if(!Vnew[j]&&_min>lowcost[j]) { _min=lowcost[j]; k=j; } } ans=max(ans,_min); Vnew[k]=1; for(j=1;j<=n;j++) { if(!Vnew[j]&&lowcost[j]>_map[k][j]) { lowcost[j]=_map[k][j]; } } } return ans;}int main (void){ int T,i,j; int k; scanf("%d",&T); int n; while(T--) { scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&_map[i][j]); k=prime(n); printf("%d\n",k); } return 0;}

 

转载地址:http://krpul.baihongyu.com/

你可能感兴趣的文章
MyEclipse------如何连接MySQL
查看>>
如何利用脚本实现MySQL的快速部署以及一机多实例的部署
查看>>
uva 11270 - Tiling Dominoes(插头dp)
查看>>
[翻译] - <Entity Framework> - 直接执行数据库命令
查看>>
异常:System.BadImageFormatException,未能加载正确的程序集XXX
查看>>
Unity3D架构设计NavMesh寻路(未完待续)
查看>>
DRM
查看>>
android:layout_gravity 和android:gravit的区别?
查看>>
数据库设计(2/9):域,约束和默认值(Domains, Constraints and Defaults)
查看>>
使用 LocalReport 对象进行打印
查看>>
[SLAM]2D激光扫描匹配方法
查看>>
省市区 - 三级联动通用化模块组件
查看>>
浅谈深度学习中潜藏的稀疏表达
查看>>
Android双击返回键退出Activity的两种方法
查看>>
正则表达式总结 java 等
查看>>
delphi query阻塞执行 长时间执行sql的解决办法
查看>>
maven打包异常
查看>>
转: Android开发的网络抓包
查看>>
webservice(CXF)基于3.1.1版本实例
查看>>
linux常用命令集锦
查看>>