lzm
who dare win.
posts - 14, comments - 29, trackbacks - 0, articles - 0
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2009年4月
>
日
一
二
三
四
五
六
29
30
31
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
1
2
3
4
5
6
7
8
9
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔分类
(13)
Algorithm(10)
OJ(3)
随笔档案
(14)
2009年4月 (11)
2009年3月 (2)
2008年10月 (1)
收藏夹
(4)
POJ
SL(4)
ZOJ
最新随笔
1. poj 1094 Sorting It All Out
2. Floyd_Warshall算法
3. Kruskal算法
4. Prim算法
5. Critical Path 关键路径
6. Bellman_Ford算法 SPFA算法
7. Dijkstra算法
8. USP 无权最短路径算法
9. Topsort 拓扑排序
10. (正则表达式)是否匹配(字符串)
11. Quicksort 快速排序
12. poj 1024 Tester Program
13. poj 1022 Packing Unit 4D Cubes
14. 加减乘除24
搜索
积分与排名
积分 - 38487
排名 - 543
最新评论
1. re: Dijkstra算法
请问一下,这个路径可以输出成功吗?为什么我的差不多可输不出来呢?
prev[w] = v; 只加着一句就够了吗?
--毛
2. re: (正则表达式)是否匹配(字符串)[未登录]
呃……请问为什么我输入A*G.C和AGTGTC,结果是dismatch呢?
--xyz
3. re: Kruskal算法
这个程序是不是有个bug:
如果节点数量为1,边数量为0
则应该是有生成树的,但是kruskal函数返回结果为false吧
个人意见
--mwxjm
4. re: 加减乘除24
想问下~为什么tb1函数要swap交换后在执行后有swap
--65666
5. re: poj 1024 Tester Program[未登录]
灰常感谢LZ,看了你的第5条那个,让debug了3个小时的我一下就过了;
因为我的初始化原来是-1,所以酿成杯具啊。。
这bug。。汗。
--joy
阅读排行榜
1. Dijkstra算法(6181)
2. Kruskal算法(4521)
3. Prim算法(4334)
4. (正则表达式)是否匹配(字符串)(3866)
5. 加减乘除24(2387)
评论排行榜
1. 加减乘除24(7)
2. poj 1094 Sorting It All Out(5)
3. Quicksort 快速排序(4)
4. (正则表达式)是否匹配(字符串)(3)
5. Dijkstra算法(3)
Prim算法
Posted on 2009-04-10 19:11
lzmagic
阅读(4334)
评论(1)
编辑
收藏
引用
所属分类:
Algorithm
/**/
/*
*
* PRIM(简单版) 最小生成树算法 (Minimum Spanning Tree)
* 输入:图g; // 有向图或者无向图
* 输出:(1)最小生成树长sum;
* (2)最小生成树prev。
* 结构: 图g用邻接矩阵表示,最短边长dist用数组表示。
* 算法:Prim算法
* 复杂度:O(|V|^2)
*/
#include
<
iostream
>
#include
<
vector
>
#include
<
list
>
#include
<
iterator
>
#include
<
algorithm
>
#include
<
numeric
>
#include
<
functional
>
#include
<
climits
>
using
namespace
std;
int
n;
//
n : 顶点个数
vector
<
vector
<
int
>
>
g;
//
g : 图(graph)(用邻接矩阵(adjacent matrix)表示)
vector
<
bool
>
known;
//
known : 各点是否已经选取
vector
<
int
>
dist;
//
dist : 已选取点集到未选取点的最小边长
vector
<
int
>
prev;
//
prev : 最小生成树中各点的前一顶点
int
s;
//
s : 起点(start)
int
sum;
//
sum : 最小生成树长
bool
Prim()
//
贪心算法(Greedy Algorithm)
{
known.assign(n,
false
);
dist.assign(n, INT_MAX);
prev.resize(n);
//
初始化known、dist、prev。
dist[s]
=
0
;
//
初始化起点到自身的路径长为0。
int
i;
for
(i
=
0
; i
<
n;
++
i)
{
int
min
=
INT_MAX, v;
for
(
int
i
=
0
; i
<
n;
++
i)
if
(
!
known[i]
&&
min
>
dist[i])
min
=
dist[i], v
=
i;
//
寻找未知的最短路径长的顶点v,
if
(min
==
INT_MAX)
break
;
//
如果找不到,退出;
known[v]
=
true
;
//
如果找到,将顶点v设为已知,
sum
+=
dist[v];
//
调整最小生成树长
for
(
int
w
=
0
; w
<
n;
++
w)
//
遍历所有v指向的顶点w,
if
(
!
known[w]
&&
g[v][w]
<
INT_MAX
&&
dist[w]
>
g[v][w])
dist[w]
=
g[v][w], prev[w]
=
v;
//
调整顶点w的最短路径长dist和最短路径的前一顶点 prev。
}
return
i
==
n;
//
如果选取顶点个数为n,成功。
}
int
main()
{
n
=
7
;
g.assign(n, vector
<
int
>
(n, INT_MAX));
g[
0
][
1
]
=
g[
1
][
0
]
=
2
; g[
0
][
2
]
=
g[
2
][
0
]
=
4
; g[
0
][
3
]
=
g[
3
][
0
]
=
1
;
g[
1
][
3
]
=
g[
3
][
1
]
=
3
; g[
1
][
4
]
=
g[
4
][
1
]
=
10
;
g[
2
][
3
]
=
g[
3
][
2
]
=
2
; g[
2
][
5
]
=
g[
5
][
2
]
=
5
;
g[
3
][
4
]
=
g[
4
][
3
]
=
7
; g[
3
][
5
]
=
g[
5
][
3
]
=
8
; g[
3
][
6
]
=
g[
6
][
3
]
=
4
;
g[
4
][
6
]
=
g[
6
][
4
]
=
6
;
g[
5
][
6
]
=
g[
6
][
5
]
=
1
;
s
=
0
;
//
起点任选
sum
=
0
;
if
(Prim())
{
cout
<<
sum
<<
endl;
for
(
int
i
=
1
; i
<
n;
++
i)
if
(i
!=
s) cout
<<
prev[i]
<<
"
->
"
<<
i
<<
endl;
}
else
{
cout
<<
"
Some vertex cann't be reached.
"
<<
endl;
}
system(
"
pause
"
);
return
0
;
}
Feedback
#
re: Prim算法
回复
更多评论
2009-04-15 12:52 by
brightcoder
good!~
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
Floyd_Warshall算法
Kruskal算法
Prim算法
Critical Path 关键路径
Bellman_Ford算法 SPFA算法
Dijkstra算法
USP 无权最短路径算法
Topsort 拓扑排序
(正则表达式)是否匹配(字符串)
Quicksort 快速排序
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © lzmagic