博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 1751 Highways(最小生成树&Prim)题解
阅读量:5023 次
发布时间:2019-06-12

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

思路:

一开始用Kruskal超时了,因为这是一个稠密图,边的数量最惨可能N^2,改用Prim。

Prim是这样的,先选一个点(这里选1)作为集合A的起始元素,然后其他点为集合B的元素,我们要做的就是每次找到B中的一个点,满足这个点到A的权值是B到A的权值中最小的,然后我们把这个点加入到A,再更新B中的点到A的最小距离。

代码:

#include
#include
#include
#include
#include
#define ll long longusing namespace std;const int N = 750+5;int mp[N][N]; //i j的距离int vis[N];int dis[N]; //点到集合的最小距离int lian[N];int n;struct node{ int x,y;}p[N];void init(){ for(int i = 1;i <= n;i++){ //建图 scanf("%d%d",&p[i].x,&p[i].y); for(int j = 1;j <= i;j++){ mp[i][j] = mp[j][i] = (p[i].x - p[j].x)*(p[i].x - p[j].x) + (p[i].y - p[j].y)*(p[i].y - p[j].y); } } int Q,a,b; scanf("%d",&Q); while(Q--){ scanf("%d%d",&a,&b); mp[a][b] = mp[b][a] = 0; } memset(vis,0,sizeof(vis)); //标记该点是否连接 for(int i = 1;i <= n;i++){ dis[i] = mp[i][1]; lian[i] = 1; //初始都和1的距离最小 } vis[1] = 1;}void Prim(){ for(int i = 1;i < n;i++){ //找n-1条边 int MIN = 100000005; int point; for(int j = 1;j <= n;j++){ if(!vis[j] && dis[j] < MIN){ MIN = dis[j]; point = j; } } vis[point] = 1; //找到了 if(mp[point][lian[point]] != 0) //为零是已经有路的 printf("%d %d\n",point,lian[point]); //点和他相连的点 for(int j = 1;j <= n;j++){ if(!vis[j] && mp[j][point] < dis[j]){ lian[j] = point; dis[j] = mp[j][point]; } } }}int main(){ scanf("%d",&n); init(); Prim(); return 0;}

转载于:https://www.cnblogs.com/KirinSB/p/9408787.html

你可能感兴趣的文章
【转】JAVA字符串格式化-String.format()的使用
查看>>
【转】ButterKnife基本使用--不错
查看>>
【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”...
查看>>
函数中关于const关键字使用的注意事项
查看>>
微信架构(转)
查看>>
Web项目中的路径问题
查看>>
js随机数的取整
查看>>
关于解析漏洞
查看>>
十大经典预测算法(六)---集成学习(模型融合算法)
查看>>
用php做一个简单的注册用户功能
查看>>
一款基于css3的3D图片翻页切换特效
查看>>
Feign使用Hystrix无效原因及解决方法
查看>>
Sizeof与Strlen的区别与联系
查看>>
hadoop2.2.0_hbase0.96_zookeeper3.4.5全分布式安装文档下载
查看>>
Flutter 贝塞尔曲线切割
查看>>
golang 的编译安装以及supervisord部署
查看>>
easyui源码翻译1.32--Dialog(对话框窗口)
查看>>
阿里架构师,讲述基于微服务的软件架构模式
查看>>
Eclipse导入maven项目时,Pom.xml文件报错处理方法
查看>>
01、JAVA开发准备
查看>>