如何求有向图的最小生成树的算法

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

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧