码迷,mamicode.com
首页 > 其他好文 > 详细

最小生成树(prim&kruskal)

时间:2015-11-18 21:26:03      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:

  最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改。先把算法过程记下来:

prime算法:

 技术分享                 技术分享           技术分享         技术分享

技术分享     原始的加权连通图——————D被选作起点,选与之相连的权值最小的边————选与D、A相连权值最小的边——————可选的有B(7)、E(8)、G(11)

技术分享            技术分享     

 

      技术分享     技术分享

————————————————————————————————————————————————————————————————重复上述步骤,最小生成树

 

代码:

 

用maze[M][M]存两点间的长度,vis[M]判断是否使用此边,dis[M]记录最小生成树的权值。

(代码来自学长发的模板)

 

技术分享
 1 #include"iostream"
 2 #include"cstring"
 3 #include"cstdio"
 4 
 5 #define INF 0x7f7f7f7f
 6 #define MAXN 1005
 7 
 8 using namespace std;
 9 
10 int n,m;
11 int maze[MAXN][MAXN];
12 bool vis[MAXN];
13 int dis[MAXN];
14 
15 void prim()
16 {
17     int ans = 0;
18     dis[1] = 0;
19     for(int i = 1;i <= n;i++)
20     {
21         int mark = INF;
22         int minn = INF;
23         for(int j = 1;j <= n;j++)
24         {
25             if(!vis[j] && dis[j] < minn)//判断每次选的都是当前情况下的最小权值
26             {
27                 minn = dis[j];
28                 mark = j;
29             }
30         }
31         vis[mark] = true;
32         ans += dis[mark];
33         for(int j = 1;j <= n;j++)
34         {
35             if(!vis[j] && maze[mark][j] < dis[j])     //选边
36             {
37                 dis[j] = maze[mark][j];
38             }
39         }
40     }
41     printf("%d\n",ans);
42 }
43 
44 int main(void)
45 {
46     while(~scanf("%d%d",&n,&m))
47     {
48         memset(maze,INF,sizeof(maze));
49         memset(vis,false,sizeof(vis));
50         memset(dis,INF,sizeof(dis));
51         while(m--)
52         {
53             int x,y,len;
54             scanf("%d%d%d",&x,&y,&len);
55             if(x != y && maze[x][y] > len)//初始化两点间的权值
56             {
57                 maze[x][y] = len;
58                 maze[y][x] = len;
59             }
60         }
61         prim();
62     }
63     return 0;
64 }
View Code

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~·*****************************************************************************************************************`~~~

 

 

 

kruskal算法:

技术分享               技术分享             技术分享         技术分享

—————————————————————————把边排序,先选定最小的边——————依次找边——————————————————

 

技术分享

————————最小生成树

代码好像有点复杂,要用上并查集,决定结合多方自己补个模板(????)

参考博客:

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html技术分享

 

最小生成树(prim&kruskal)

标签:

原文地址:http://www.cnblogs.com/yinqx/p/4975717.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!