各位朋友,可否有哪位朋友帮我用c语言来实现这个程序呀

时间:2023-02-21 10:17:09
最小生成树 
问题描述:若要在n个城市之间建设通信网络,只需要架设n-1条线路即可。如何以最低的经济代价建设这个
          通信网,是一个网的最小生成树问题。
基本要求:
(1)利用Prim算法求网的最小生成树。
(2)自定义一种输出方式。

请给出详细的算法,要求能够在turboc下实现哦~~~~~

10 个解决方案

#1


/*=======================Prim算法====================================*/
#define MAXINT 9999
#define MAXN 100
int n,u;

/*cost[][]为带权图的邻接矩阵*/
/*n为图的顶点数;u为起始顶点*/
void Prim(int cost[][MAXN],int n,int u)
{
    int lowcost[MAXN],n;
    int clsest[MAXN]; //顶点序列
    int i,j,k;
    
for(i=1;i<=n;i++) //初始处理
    {
        lowcost[i]=cost[u][i]; //起始点u到V-U集合中各顶点的权存放在lowcost[]中
closest[i]=u; //将从U的各顶点里到达V-U中各顶点权最小的顶点
    }

for(i=1;i<=n;i++) //主循环,若U=V,则算法结束;否则,从E中选一条代价最小的边(u,v),并将u加入U中
{
min=MAXINT;
for(j=1;j<=n;j++) //用选择排序的概念从lowcost[]中找到U到V-U中代价最小的边
if(lowcost[j]!=0&& //该顶点不在U中
lowcost[j]<min) //该到顶点边的权比已经找到的权最小的边还要小
{
min=lowcost[j];
k=j;
}
printf("{%3d %3d %5d}", //打印邻接到U中顶点,权最小的边
      closest[k],k,min);
lowcost[k]=0; //将该顶点放入U中,即将lowcost[k]设置为0
for(j=1;j<=n;j++) //U中加入k后,更新lowcost[],重新登记最小权
if(cost[k][j]!=0&&
cost[k][j]<lowcost[j])
{
lowcost[j]=cost[k][j]; //把从U到V-U中各点权最小的边的权记录下来
closest[j]=k; //将到j距离最短距离的顶点更新为k
}
}
}
sorry 注解是用c++风格写的抱歉

--------------------------------------

以上是转的.

#2


有没有人帮我用c语言来实现呀  拜托  c++我没有实现过呀

#3


这个就是C的.只不过注释是C++的,把注释改一下就好了.

#4


呵呵~是不是找人做作业哦

#5


有没有搞错啊,是不是c语言写的他自己难道看不出来吗???不用心的人!!!!
自己肯定是没耐心.

#6


呵呵,C++论坛的人都在啊

#7


大家批评的非常的是,本人在这里说声:实在非常的不好意思。这个的确是我的作业,是课程设计,由于马上有各种考试,所以只有通过这种渠道请大家的帮忙哈。我还想问一句,怎么才能给分呀,不是我这题给出了50分,怎么给帮助我的人呀?  还有随便说一句,这个程序有26个错误,怎么改呀,有没有哪个朋友帮人帮到底呀,让我一次懒个够吧。谢谢~~~

#8


怎么给人家一个有26个错误的程序呢,好好玩哦!

对lov_aming:可能是你的tc没装好吧,26个错误,这个数字好熟悉哦,我有时候没弄好那个tc,也会有这么多错的。
另外,你可以去图书馆找呀,这种程序书上太多了哦,呵呵。

#9


哦 这位朋友 是真的吗?不知道那本书上有,可否详细地说明一下那本书呀
还有 没有回答我的问题  就是怎么给帮助我的朋友 加分呀

#10


在数据结构上就有啊!清华的C版。

#1


/*=======================Prim算法====================================*/
#define MAXINT 9999
#define MAXN 100
int n,u;

/*cost[][]为带权图的邻接矩阵*/
/*n为图的顶点数;u为起始顶点*/
void Prim(int cost[][MAXN],int n,int u)
{
    int lowcost[MAXN],n;
    int clsest[MAXN]; //顶点序列
    int i,j,k;
    
for(i=1;i<=n;i++) //初始处理
    {
        lowcost[i]=cost[u][i]; //起始点u到V-U集合中各顶点的权存放在lowcost[]中
closest[i]=u; //将从U的各顶点里到达V-U中各顶点权最小的顶点
    }

for(i=1;i<=n;i++) //主循环,若U=V,则算法结束;否则,从E中选一条代价最小的边(u,v),并将u加入U中
{
min=MAXINT;
for(j=1;j<=n;j++) //用选择排序的概念从lowcost[]中找到U到V-U中代价最小的边
if(lowcost[j]!=0&& //该顶点不在U中
lowcost[j]<min) //该到顶点边的权比已经找到的权最小的边还要小
{
min=lowcost[j];
k=j;
}
printf("{%3d %3d %5d}", //打印邻接到U中顶点,权最小的边
      closest[k],k,min);
lowcost[k]=0; //将该顶点放入U中,即将lowcost[k]设置为0
for(j=1;j<=n;j++) //U中加入k后,更新lowcost[],重新登记最小权
if(cost[k][j]!=0&&
cost[k][j]<lowcost[j])
{
lowcost[j]=cost[k][j]; //把从U到V-U中各点权最小的边的权记录下来
closest[j]=k; //将到j距离最短距离的顶点更新为k
}
}
}
sorry 注解是用c++风格写的抱歉

--------------------------------------

以上是转的.

#2


有没有人帮我用c语言来实现呀  拜托  c++我没有实现过呀

#3


这个就是C的.只不过注释是C++的,把注释改一下就好了.

#4


呵呵~是不是找人做作业哦

#5


有没有搞错啊,是不是c语言写的他自己难道看不出来吗???不用心的人!!!!
自己肯定是没耐心.

#6


呵呵,C++论坛的人都在啊

#7


大家批评的非常的是,本人在这里说声:实在非常的不好意思。这个的确是我的作业,是课程设计,由于马上有各种考试,所以只有通过这种渠道请大家的帮忙哈。我还想问一句,怎么才能给分呀,不是我这题给出了50分,怎么给帮助我的人呀?  还有随便说一句,这个程序有26个错误,怎么改呀,有没有哪个朋友帮人帮到底呀,让我一次懒个够吧。谢谢~~~

#8


怎么给人家一个有26个错误的程序呢,好好玩哦!

对lov_aming:可能是你的tc没装好吧,26个错误,这个数字好熟悉哦,我有时候没弄好那个tc,也会有这么多错的。
另外,你可以去图书馆找呀,这种程序书上太多了哦,呵呵。

#9


哦 这位朋友 是真的吗?不知道那本书上有,可否详细地说明一下那本书呀
还有 没有回答我的问题  就是怎么给帮助我的朋友 加分呀

#10


在数据结构上就有啊!清华的C版。