这个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的结果。。。注意长度