最小生成树 prim
2016-06-02 10:18
239 查看
#include "stdio.h"
#include "stdlib.h"
#define MAX 110
int a[MAX][MAX],p[MAX];
int main(void)
{
int i,j,k,n,t,min,sum,new_point,x,y,d;
printf("请输入顶点的个数:");
scanf("%d",&n);
t=n*(n-1)/2;
for(i=0;i<MAX;i++){
p[i] = 0;
}
//memset(p,0,sizeof(p)); //将p数组初始化为0
printf("请输入每条边的起始端点、权值:/n");
for(i=0;i<t;i++)
{
scanf("%ld%ld%ld",&x,&y,&d); //输入每条边的权值
a[x][y]=a[y][x]=d;
}
p[1]=1;
sum=0;
for(k=0;k<n-1;k++)
{
min=-1;
for(i=1;i<=n;i++)
{
if(p[i]==1)
{
for(j=1;j<=n;j++)
{
if(p[j]==0 && (min==-1 || min>a[i][j]))
{
min=a[i][j]; //从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边
new_point=j;
}
}
}
}
p[new_point]=1;
sum+=min;
}
printf("最小生成树的权值为:%d/n",sum);
system("pause");
return 0;
}
#include "stdlib.h"
#define MAX 110
int a[MAX][MAX],p[MAX];
int main(void)
{
int i,j,k,n,t,min,sum,new_point,x,y,d;
printf("请输入顶点的个数:");
scanf("%d",&n);
t=n*(n-1)/2;
for(i=0;i<MAX;i++){
p[i] = 0;
}
//memset(p,0,sizeof(p)); //将p数组初始化为0
printf("请输入每条边的起始端点、权值:/n");
for(i=0;i<t;i++)
{
scanf("%ld%ld%ld",&x,&y,&d); //输入每条边的权值
a[x][y]=a[y][x]=d;
}
p[1]=1;
sum=0;
for(k=0;k<n-1;k++)
{
min=-1;
for(i=1;i<=n;i++)
{
if(p[i]==1)
{
for(j=1;j<=n;j++)
{
if(p[j]==0 && (min==-1 || min>a[i][j]))
{
min=a[i][j]; //从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边
new_point=j;
}
}
}
}
p[new_point]=1;
sum+=min;
}
printf("最小生成树的权值为:%d/n",sum);
system("pause");
return 0;
}
相关文章推荐
- UI(base)-1
- 【c++】映射表std::map
- informix系统表
- 每天laravel-20160820| ContextualBinding
- Tomcat启动时提示端口号冲突
- Oracle 12c OCM 直考体验
- Solr4.2教程 配置文件属性等
- iOS开发示例————使用CAShapeLayer&UIBezierPath绘制数据饼图
- 深入理解JQuery循环绑定事件
- WinForm支持拖拽效果
- _Time
- 6.1 考试修改+总结
- 每天laravel-20160820| ContextualBinding
- Bean、Map相互转换
- 产品经理应该掌握的技能(一)
- Gpupdate命令详解
- 二分查找
- JAVA 工程师 技术总览
- Invalid byte 3 of 3-byte UTF-8 sequence.
- 关于malloc/free的学习心得