普里姆算法
2015-07-21 22:15
267 查看
普里姆算法:每次寻找一条权值较少,且一个顶点在集合内,另一个不在集合内的边,添加到集合内,因为该点的添加导致其余dis[i]储存的非生成树点到生成树的距离改变,如果其余非生成树点到该点的距离比原来缩短了,那就改变dis[i]的值.
#include <stdio.h>
int main()
{
int dis[101];
int book[101];
int a[101][101];
int i,j,n,b,c,d,m,k,sum,count,min;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (i==j) a[i][j]=0;
else a[i][j]=9999;
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&b,&c,&d);
a[b][c]=d;
a[c][b]=d;
}
for(i=1;i<=n;i++)
dis[i]=a[1][i];
for (i=1;i<=n;i++)
book[i]=0;
book[1]=1;
sum=0;
count=1;
while(count<n)
{
min=9999;
for (i=1;i<=n;i++)//每次找距离树的最小边
if((book[i]==0)&&(dis[i]<min))//最小边不能被访问过
{
min=dis[i];
j=i;
}
book[j]=1;
count++;
sum=sum+min;//记录代价
for (k=1;k<=n;k++)
if ((book[k]==0)&&(dis[k]>a[j][k]))//r如果新增的点能够缩短非树顶点到生成树的距离(只需缩短未添加到集合内的点就可以了)(类似迪杰斯特拉算法)
{
dis[k]=a[j][k];
}
}
printf("%d\n",sum);
return 0;
}
#include <stdio.h>
int main()
{
int dis[101];
int book[101];
int a[101][101];
int i,j,n,b,c,d,m,k,sum,count,min;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (i==j) a[i][j]=0;
else a[i][j]=9999;
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&b,&c,&d);
a[b][c]=d;
a[c][b]=d;
}
for(i=1;i<=n;i++)
dis[i]=a[1][i];
for (i=1;i<=n;i++)
book[i]=0;
book[1]=1;
sum=0;
count=1;
while(count<n)
{
min=9999;
for (i=1;i<=n;i++)//每次找距离树的最小边
if((book[i]==0)&&(dis[i]<min))//最小边不能被访问过
{
min=dis[i];
j=i;
}
book[j]=1;
count++;
sum=sum+min;//记录代价
for (k=1;k<=n;k++)
if ((book[k]==0)&&(dis[k]>a[j][k]))//r如果新增的点能够缩短非树顶点到生成树的距离(只需缩短未添加到集合内的点就可以了)(类似迪杰斯特拉算法)
{
dis[k]=a[j][k];
}
}
printf("%d\n",sum);
return 0;
}
相关文章推荐
- 温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对)
- Ubuntu 14.04(32位)安装Oracle 11g(32位)全过程
- Oracle 创建分页存储过程(转帖)
- 哈希表原理及hashmap简单实现
- LeetCode之Maximal Rectangle
- 阿里面试题目总结
- 多线程之线程锁的使用
- 痛并快乐着
- 协程 及 Libco 介绍
- JDBC连接MySql数据库
- Maven实战(坐标和依赖)
- 【树形dp】hdu 1011 Starship Troopers
- Linux僵尸进程的解决
- Github for Windows
- Opencv3.0.0 vs2012 win7配置
- Linux下安装opencv
- 2015第30周二
- Ubuntu系统安装配置Pintos和Bochs
- 13. JavaSE-多态 & 内部类
- 第62讲scala 隐式参数实例解析