POJ 1258 Agri-Net(Prim算法)
2024-09-06 15:45:16
题意:n个农场,求把所有农场连接起来所需要最短的距离。
思路:prim算法
课本代码:
//prim算法
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std; int n;
int tot;
int v[150][150];
int dist[150];//存 节点到树 的最小距离
bool use[150];//标记节点是否存在 int main(){
while(scanf("%d",&n)!=EOF){
memset(use,false,sizeof(use));//初始化节点 都存在
tot=0;
use[0]=1;
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&v[i][j]);
dist[0]=0x7FFFFFFF;//赋值为最大值
for(i=1;i<n;i++)//初始距离
dist[i]=v[0][i];
for(i=1;i<n;i++){//连接 剩下的 n-1个节点
int tmp=0;
for(k=1;k<n;k++)//找到最短的距离 节点
if(dist[k]<dist[tmp] &&!use[k]) tmp=k;
tot +=dist[tmp];// 加到 总距离中
use[tmp]=true;
for(k=1;k<n;k++)//调整距离
if(!use[k])
dist[k]=v[k][tmp]<dist[k]?v[k][tmp]:dist[k];
}
printf("%d\n",tot);
}
return 0;
}
另外,这道题也可以用 Kruskal算法,代码如下:
//Kruskal算法
#include<iostream>
using namespace std; int fa[120];
int get_father(int x){
return fa[x]=fa[x]==x?x:get_father(fa[x]);//判断两个节点是否属于一颗子树(并查集)
}
int main(){
int n;
int p[120][120];
int mark[100100];
while(scanf("%d",&n)!=EOF){
memset(mark,0,sizeof(mark));
int i,j,k,m;
for(i=0;i<n;i++)
for(j=0;j<n;j++){
scanf("%d",&p[i][j]);
mark[p[i][j]]=1;
}
for(i=0;i<n;i++) fa[i]=i;
int ans=0;
for(k=1;k<=100000;k++)// kruskal 算法
if(mark[k]){// 若不加mark ,会超时
for(i=0;i<n;i++)
for(int j=0;j<n;j++)
if(p[i][j]==k &&get_father(i)!=get_father(j)){
fa[fa[i]]=fa[j];//合并两颗子树(并查集)
ans+=k;
}
}
printf("%d\n",ans);
}
return 0;
}
最新文章
- docker-compose编写(英文)
- windows下docker环境设置
- 按照索引的细化提取骨架算法的java实现
- Linq之Linq to XML
- Delphi的时间处理
- 微软的MCE(Media Center Edition 媒体中心)标准
- 28 自定义View侧滑栏
- 初学Socket通信
- 初步学习python
- 【编程语言】Kotlin之object关键字
- 关于VMware虚拟机安装镜像时黑屏的解决办法
- 构建工具build tools
- MLlib之LR算法源码学习
- 001 Spark的简介以及入门
- [Python] 05 - Load data from Files
- [idea] - 项目启动报错Process finished with exit code 1
- 详解Vue中watch的高级用法
- 去掉tableView空白区域的分割线
- maven打包时跳过单元测试
- 解决DoubanFM第三方客户端UI线程与工作线程交互问题