社区
数据结构与算法
帖子详情
如何求有向图的最小生成树的算法
renxiaoyao
2002-12-11 09:29:33
如何求有向图的最小生成树算法
...全文
392
11
打赏
收藏
如何求有向图的最小生成树的算法
如何求有向图的最小生成树算法
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Riemann
2002-12-18
打赏
举报
回复
Prim & Kruskal算法仅能用于无向图吧?很容易举出不能使用这两种算法的有向图的例子呀。
starfish
2002-12-18
打赏
举报
回复
呵呵:D
LeeMaRS
2002-12-15
打赏
举报
回复
……当我透明……?
zhoukun666
2002-12-15
打赏
举报
回复
最小生成树算法
问题:在一个连通图中寻找一棵树,使得它的各边的权值之和最小。
算法:Kruskal MiniSpanTree:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int Max(int a,int b)
{
return a>b?a:b;
}
int Min(int a,int b)
{
return a<b?a:b;
}
void main()
{
float data[20][3] = {{1, 2, 10}, {1, 3, 9.8}, {1, 5, 7.0}, {1, 9, 3.7}, {2, 4, 5.7},
{2, 6, 6}, {2, 10, 10.0}, {3, 4, 3.5}, {3, 6, 7.7}, {3, 8, 8.8}, {3, 10, 4},
{4, 6, 12}, {4, 7, 13}, {4, 8, 3.9}, {5, 6, 4.9}, {5, 8, 4.5}, {6, 9, 1.8},
{7, 10, 12}, {8, 9, 9}, {9, 10, 20.0}};
int i,j,k,m,n=20,v=10;
int flag[11],tree[20];
int min,max;
float t,tt;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(data[j][2]<data[k][2]) k=j;
if(k!=i)
for(m=0;m<=1;m++)
{ tt=data[i][m]; data[i][m]=data[k][m]; data[k][m]=tt; }
t=data[i][2]; data[i][2]=data[k][2]; data[k][2]=t;
}
system("cls");
printf("Graph:\n");
j=0;
for(i=0;i<n;i++)
{
j++;
printf("%2d: %2d ---- %2d %8.2f\n",j,(int)data[i][0],(int)data[i][1],data[i][2]);
}
for(i=0;i<v;i++)
flag[i]=i;
for(i=0;i<n;i++)
tree[i]=0;
for(i=0;i<n;i++)
{
if(flag[(int)data[i][0]]!=flag[(int)data[i][1]])
{
tree[i]=1;
max=Max(flag[(int)data[i][0]],flag[(int)data[i][1]]);
min=Min(flag[(int)data[i][0]],flag[(int)data[i][1]]);
for(j=1;j<=v;j++)
if(flag[j]==max)
flag[j]=min;
}
}
printf("Kruskal MiniSpanTree:\n");
j=0;
for(i=0;i<n;i++)
if(tree[i])
{
j++;
printf("%d: %2d ---- %2d %8.2f\n",j,(int)data[i][0],(int)data[i][1],data[i][2]);
}
}
LeeMaRS
2002-12-14
打赏
举报
回复
吐血, 我打错了, 应该是"只能用于无向图上"
林仪明
2002-12-14
打赏
举报
回复
9494
LeeMaRS
2002-12-14
打赏
举报
回复
Prim和Kruskal好像只能用于有向图上啊??难道我记错了..
one_ear
2002-12-14
打赏
举报
回复
你是想知道思想还是代码?
如果我没几错的话应该是扑里木算法和可鹭鸶卡而算法(多处拼写错误,见谅)
思想是不复杂的,代码吗,其实也不复杂,你在
清华大学出的严蔚敏的书上看看吧,很简单的
dcyu
2002-12-14
打赏
举报
回复
给一个kruskal算法的例子:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int Max(int a,int b)
{
return a>b?a:b;
}
int Min(int a,int b)
{
return a<b?a:b;
}
void main()
{
float data[20][3] = {{1, 2, 10}, {1, 3, 9.8}, {1, 5, 7.0}, {1, 9, 3.7}, {2, 4, 5.7},
{2, 6, 6}, {2, 10, 10.0}, {3, 4, 3.5}, {3, 6, 7.7}, {3, 8, 8.8}, {3, 10, 4},
{4, 6, 12}, {4, 7, 13}, {4, 8, 3.9}, {5, 6, 4.9}, {5, 8, 4.5}, {6, 9, 1.8},
{7, 10, 12}, {8, 9, 9}, {9, 10, 20.0}};
int i,j,k,m,n=20,v=10;
int flag[11],tree[20];
int min,max;
float t,tt;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(data[j][2]<data[k][2]) k=j;
if(k!=i)
for(m=0;m<=1;m++)
{ tt=data[i][m]; data[i][m]=data[k][m]; data[k][m]=tt; }
t=data[i][2]; data[i][2]=data[k][2]; data[k][2]=t;
}
system("cls");
printf("Graph:\n");
j=0;
for(i=0;i<n;i++)
{
j++;
printf("%2d: %2d ---- %2d %8.2f\n",j,(int)data[i][0],(int)data[i][1],data[i][2]);
}
for(i=0;i<v;i++)
flag[i]=i;
for(i=0;i<n;i++)
tree[i]=0;
for(i=0;i<n;i++)
{
if(flag[(int)data[i][0]]!=flag[(int)data[i][1]])
{
tree[i]=1;
max=Max(flag[(int)data[i][0]],flag[(int)data[i][1]]);
min=Min(flag[(int)data[i][0]],flag[(int)data[i][1]]);
for(j=1;j<=v;j++)
if(flag[j]==max)
flag[j]=min;
}
}
printf("Kruskal MiniSpanTree:\n");
j=0;
for(i=0;i<n;i++)
if(tree[i])
{
j++;
printf("%d: %2d ---- %2d %8.2f\n",j,(int)data[i][0],(int)data[i][1],data[i][2]);
}
}
LeeMaRS
2002-12-14
打赏
举报
回复
最小生成树是指在无向图上的, 有向图上只有最小树形图~ 具体算法比较复杂, 可以参看吴文虎的 图论的算法与程序设计 URL:http://oibh.ioiforum.org/download/ebook/book003.zip 用超星阅读器看
BambooTang
2002-12-14
打赏
举报
回复
ft!
prim or kruskal
java数百种
算法
实现
java数百种
算法
实现
1000多种java
算法
大全源码包
1000多种java
算法
大全源码包
朱刘
算法
有向图
的
最小生成树
朱刘
算法
有向图
的类Prim
算法
,找
有向图
的
最小生成树
最小树形图 树形图: 无有向环 除了根节点外,每个点入度为1 以某个点为根的一棵有向树,其边权之和为图中所有树形图中是最小的称为最小树形图。 朱刘
算法
O(nm)O(nm)O(nm) (1) 除了根节点外对每个点选取一条边权最小的入边 (2)判断当前(选出的边)组成的图中有无环 1.若无环:则说明当前图已经为构造好的
最小生成树
,
算法
结束 2.若有环:进行第(3)步 (3)将构造的图进行强连通分量缩点,得到新图G′G'G′,对于G′G'G′
最小生成树
算法
(Prim Kruskal)
最小生成树
算法
总览
最小生成树
的定义及性质 Prim(普利姆)
算法
[朴素Prim
算法
堆优化Prim
算法
] Prim
算法
求
最小生成树
[朴素Prim的代码实现 堆优化Prim的代码实现] Kruskal(克鲁斯卡尔)
算法
[Kruskal
算法
求
最小生成树
]
最小生成树
算法
最小生成树
算法
生成树的概念
最小生成树
算法
Prim
算法
Kruskal
算法
生成树的概念 若图是连通的无向图或强连通的
有向图
,则从其中任一顶点出发,调用一次dfsdfsdfs或者bfsbfsbfs后,可以系统的访问图中所有顶点。 若图是有根的
有向图
,则从根出发,调用一次dfsdfsdfs或者bfsbfsbfs后,可以系统的访问图中所有顶点。 在上述情况之下,图中所有顶点加上遍历过程中经过的所有边所构成的子图称为原图的生成树。 若图是不连通的的无向图和不是强连通的
有向图
,从其中任一顶点出发,调用一次dfsd
数据结构与算法
33,027
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章