当前位置:编程学习 > C/C++ >>

这个C语言程序总是运行不了,求高手帮助

最优布线问题

内容:学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来。两台计算机被连接是指它们中间有数据线连接。由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的。当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的。为了节省费用,我们采用数据的间接传输手段,即一台计算机可以间接的通过若干台计算机(作为中转)来实现与另一台计算机的连接。现在由你负责连接些计算机,你的任务是使任意两台计算机都连通(不管是直接的或间接的)。--无向连通网

要求:

(1)输入第1行为整数n(2<=n<=100),表示计算机的数目。此后的n行,每行n个整数。第x+1行y列的整数表示直接连接第x台计算机和第y台计算机的费用。--邻接矩阵

(2)输出只有一个整数,表示最小的连接费用  <—最小生成树,所有机子连在一起的最小费用

#include "stdio.h"#include "stdlib.h"#define maxlen 100   //顶点的最大个数typedef struct node   {    int n;    int a[maxlen][maxlen];}Node;typedef struct graph{int c[maxlen];               //节点int sum;}Mgraph;Node mg;Mgraph g;void Min(int n){int i,j;int k,ki,kj;ki=1;kj=2;k=mg.a[i][j];for(i=1;i<=mg.n;i++){for(j=i+1;j<=mg.n;j++){if(mg.a[i][j]<=k&&(g.c[i]+g.c[j]==1||n==1)){k=mg.a[i][j];ki=i;kj=j;}}}g.c[ki]=1;g.c[kj]=1;g.sum=g.sum+k;}void Mintree(){int i;g.sum=0;for(i=1;i<mg.n;i++){Min(i);}printf("%d",g.sum);}void main(){ int i,j;    printf("请输入计算机的数目n(1<n<101):\n");    scanf("%d",&mg.n);printf("输入两台计算机连接的费用:\n"); for(i=1;i<=mg.n;i++){g.c[i]=0;        for(j=1;j<=mg.n;j++){       scanf("%d",&mg.a[i][j]);    //输入顶点信息}}Mintree();}





答案:相信你也知道了,这个问题是最小生成树问题。
解决该问题的经典的算法有Prim算法和Kruskal算法。
我看了一下你的算法,没怎么看懂你的算法的思想,而且还有一点语法错误。
比如:min函数中前5句,i和j没有赋初值就执行k=mg.a[i][j]; 编译和执行过程中会出问题。
下面给出Prim算法的C++代码实现。
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 100
typedef struct{
    int name;//顶点的值
    bool bState;//顶点状态
    int iState;//顶点状态
}VertexType;

typedef struct{
    int distance;//弧的值
    bool bState;//弧状态
}ArcType;

typedef struct{
    int VexNum;//顶点数
    int ArcNum;//弧数
    VertexType Vexs[MAX_VERTEX_NUM];
    ArcType Arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
}MGraph;//M is short for Matrix

typedef struct {
    int vex;
    int distance;
}myedge;
int MinClosedge(myedge closedge[],int maxvexs);
void main(){
    MGraph g;
    myedge closedge[MAX_VERTEX_NUM];
    int maxvexs;
    printf("请输入顶点个数:");
    scanf("%d",&maxvexs);
    g.VexNum=maxvexs;
    printf("无穷大请用100000或一个比较大的数来代替。\n");
    printf("请输入各顶点间的距离:\n");
    for(int i=0;i<maxvexs;i++){
        for(int j=0;j<maxvexs;j++)
            scanf("%d",&g.Arcs[i][j]);
    }


    int k=0;
    for(int i=1;i<g.VexNum;i++){
        closedge[i].vex=k;
        closedge[i].distance=g.Arcs[i][k].distance;
    }
    closedge[0].distance=0;
    int Tnum=1;//记录当前已经连接起来的顶点的个数
    int totalDis=0;//最小生成树的各弧之和
    while(Tnum<maxvexs){
        k=MinClosedge(closedge,maxvexs);
        totalDis+=closedge[k].distance;
        closedge[k].distance=0;
        Tnum++;
        for(int i=0;i<g.VexNum;i++){
            if(g.Arcs[i][k].distance<closedge[i].distance){
                closedge[i].vex=k;
                closedge[i].distance=g.Arcs[i][k].distance;
            }

        }

    }//while
    printf("最小生成树长度为:%d\n",totalDis);

}//main
int MinClosedge(myedge closedge[],int maxvexs){
    int minArc=100000;
    int vex;
    for(int i=0;i<maxvexs;i++){
        if(closedge[i].distance!=0&&closedge[i].distance!=-1&&closedge

            [i].distance<minArc){
                minArc=closedge[i].distance;
                vex=i;
        }
    }
    return vex;
}
===========================================
上述代码在VS2010环境下调试成功。
注释比较少,因为如果你没看过Prim算法,几句注释也解决不了问题。
严蔚敏版《数据结构(C语言版)》1997年4月第1版中第173页有该算法的详细讲解。
希望对你有帮助。
11

上一个:C语言编写"全盘搜索一个文件"的程序
下一个:求C语言输出999999999999+1234567890123的结果。。。注意长度

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,