&豪
豪->blog
C++博客
|
首页
|
发新随笔
|
发新文章
|
联系
|
聚合
|
管理
随笔:81 文章:90 评论:237 引用:0
最小生成树prim算法
const
int
CNST_NumGrphNodes
=
101
;
//
最小生成树元素
struct
TTreeEdge
{
int
v1, v2;
double
w;
}
;
//
候选集元素
struct
TCloseRec
{
double
lowCost;
int
vec;
}
;
int
MST_prim(
int
g[][CNST_NumGrphNodes],
int
n, TTreeEdge
*
minTree)
{
int
i, j, k;
TCloseRec
*
close
=
new
TCloseRec[n];
for
(i
=
1
; i
<
n; i
++
)
{
close[i].vec
=
0
;
close[i].lowCost
=
g[i][
0
];
}
close[
0
].lowCost
=
-
1
;
for
(i
=
0
; i
<
n
-
1
; i
++
)
{
//
找图点
for
(k
=
1
; k
<
n; k
++
)
{
if
(close[k].lowCost
!=
-
1
)
{
break
;
}
}
for
(j
=
k
+
1
; j
<
n; j
++
)
{
if
(close[j].lowCost
!=
-
1
)
{
if
(close[j].lowCost
<
close[k].lowCost)
{
k
=
j;
}
}
}
//
加入树中
minTree[i].v1
=
k;
minTree[i].v2
=
close[k].vec;
minTree[i].w
=
close[k].lowCost;
close[k].lowCost
=
-
1
;
//
调整候选集
for
(j
=
1
; j
<
n; j
++
)
{
if
(close[j].lowCost
>
g[j][k])
{
close[j].lowCost
=
g[j][k];
close[j].vec
=
k;
}
}
}
delete []close;
return
0
;
}
发表于 2006-05-01 12:06
豪
阅读(1080)
评论(3)
编辑
收藏
引用
所属分类:
数据结构与算法
评论
#
re: 最小生成树prim算法
#include <stdio.h>
#define inf 9999
#define max 40
prim(int g[][max],int n)
{int lowcost[max],closest[max];
int i,j,k,min;
for(i=2;i<=n;i++) //n个顶点,n-1条边
{lowcost[i]=g[1][i]; //初始化
closest[i]=1; //顶点未加入到最小生成树中
}
lowcost[1]=0; //标志顶点1加入U集合
for(i=2;i<=n;i++) //形成n-1条边的生成树
{min=inf;
k=0;
for(j=2;j<=n;j++) //寻找满足边的一个顶点在U,另一个顶点在V的最小边
if((lowcost[j]<min)&&(lowcost[j]!=0))
{min=lowcost[j];
k=j;
}
printf("(%d,%d)%d\t",closest[k],k,min);
lowcost[k]=0; //顶点k加入U
for(j=2;j<=n;j++) //修改由顶点k到其他顶点边的权值
if(g[k][j]<lowcost[j])
{lowcost[j]=g[k][j];
closest[j]=k;
}
printf("\n");
}
}
int adjg(int g[][max]) //建立无向图
{int n,e,i,j,k,v1,v2,weight;
printf("输入顶点个数,边的条数:");
scanf("%d,%d",&n,&e);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
g[i][j]=inf; //初始化矩阵,全部元素设为无穷大
for(k=1;k<=e;k++)
{printf("输入第%d条边的起点,终点,权值:",k);
scanf("%d,%d,%d",&v1,&v2,&weight);
g[v1][v2]=weight;
g[v2][v1]=weight;
}
return(n);
}
void prg(int g[][max],int n) //输出无向图的邻接矩阵
{int i,j;
for(i=0;i<=n;i++)
printf("%d\t",i);
for(i=1;i<=n;i++)
{printf("\n%d\t",i);
for(j=1;j<=n;j++)
printf((g[i][j]==inf)?"\t":"%d\t",g[i][j]);
}
printf("\n");
}
main()
{int g[max][max],n;
n=adjg(g);
printf("输入无向图的邻接矩阵:\n");
prg(g,n);
printf("最小生成树的构造:\n");
prim(g,n);
}
#
re: 最小生成树prim算法
代码量的确小很多:)
#
re: 最小生成树prim算法[未登录]
帅哥
刷新评论列表
标题
姓名
主页
验证码
*
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关链接:
相关文章:
红黑树(数据结构大作业扩展版)
pku3268 dij+heap
线段树类
LIS O(nlogn)
凸包...
MinHeap
树状数组
[转贴] 快速计算某个日期是星期几的经验公式
拓扑排序
合并排序
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理
<
2008年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
公告
潜心看书研究!
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(14)
给我留言
查看公开留言
查看私人留言
随笔分类
(80)
AJAX(1)
(rss)
C++之梦(11)
(rss)
DesignPattern(1)
(rss)
PHP之路(9)
(rss)
TCP/IP
(rss)
VC
(rss)
计算机图形学(2)
(rss)
生活感想(24)
(rss)
算法&ACM(32)
(rss)
文章分类
(88)
ACM题目(26)
(rss)
apache(3)
(rss)
Basic C++(8)
(rss)
Java(4)
(rss)
Linux(3)
(rss)
MFC(2)
(rss)
mysql(2)
(rss)
php学习与实践(4)
(rss)
string match(3)
(rss)
操作系统(1)
(rss)
计算机(1)
(rss)
数据结构与算法(29)
(rss)
数论(1)
(rss)
网络(1)
(rss)
相册
MY LIFE
MY PRODUCTION
SCUT/ICPC MY TEAM
ACM OJ
HOJ
POJ
TOJ
URAL
UVA
ZOJ
My friends
Apple's Garden
asp's blog
chgsh's blog
evicn's blog
jay_zzw's blog
shyli's blog
sicheng's blog
xmm's blog
豪的space
踏雪赤兔's blog
搜索
积分与排名
积分 - 67693
排名 - 22
最新评论
1. re: 这就是树状dp..好难啊..
谢谢
--newacm
2. re: 树状数组[未登录]
请问一下, out[sum(x-1) + f[x]]++; 中的sum(x-1)不是求和吗?
这句是怎样实现的啊,没看懂,麻烦lz解释一下
--David
3. re: 二分图最大匹配(匈牙利算法)
代码有问题啊 过不了poj1469的样例啊
--k
4. re: 最短路Bellman-Ford实现
大哥,你的程序连图都没输入进去,怎么计算?我试着把图放到g[][]中去,但是程序输出的结果是错误的,怎么回事?
--白冰
5. re: 状态压缩DP, pku3020
二分匹配做的。。关键是状态压缩不会。5555...
--ecnu
阅读排行榜
1. 内存池(version1.1)(2041)
2. 看 c++primer 后的一个问题(1981)
3. 中国剩余定理(同余方程组)小结(1665)
4. 扩展的欧拉函数 pku1091(1485)
5. 又是一题动态规划--经典(1262)
评论排行榜
1. 好高兴啊,a+b那题一次通过啦,acm有个好开始!!!^_^(25)
2. 今天又过条简单题,呵呵(14)
3. 看 c++primer 后的一个问题(13)
4. 变量初始化的重要性!(9)
5. 从二叉树的递归遍历想到的:利用重载函数,使函数接口更"友好"(9)