下面是这个程序是数据结构的,这个是别人的,有没有哪位高手可以帮我改一下(就是改成看不出是抄袭的那种)。没办法,本人天生就怕编程,看到就晕了,实在编不出来,才出此下策。希望有人帮我看下,在此先谢过了!
题目描述:给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。
功能要求及说明:(主要使用的知识: 图)
(1)城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。要求在屏幕上显示得到的最小生成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价;
(2)表示城市间距离网的邻接矩阵(要求至少6个城市,10条边);并且利用文件对数据进行提取。
(3)输出最小生成树中包括的边及其权值,并显示得到的最小生成树的代价。
(4)采用模块化设计;
程序如下,也可到链接下载
#define MAXVEX 40
#define MAXCOST 10000
#define N 6
#include<stdio.h>
void main()
{
FILE *p; /*定义一个指向文件的指针*/
int i=1,j,m,mx[MAXVEX][MAXVEX];char ch;
void zxscs_sh(int c[MAXVEX][MAXVEX],int n); /*函数声明*/
printf("\n!!ATTENTION: \n 1),Please create a right file and put it in the right place.\n");
printf(" 2),Please rewrite the 'N' which means the numbers in each line.\n"); /*提示信息*/
printf(" 3),Have you done it ? y(YES) or n(NO) : "); /*输出提示信息*/
getchar();
if((p=fopen("D:\\int5.txt","r"))==NULL)/*判断打开文件成功与否*/
{
printf(" !The file can not be opened\n");/*输出提示信息*/
exit(1);
}
for(m=1;m<=N;m++)
{
for(j=1;j<=N;j++)
fscanf(p,"%d",&mx[j]); /*从路径指明的文本文件中调取整型数据,并赋给数组元素*/
i++;
}
for (i=1;i<=N;i++)
for (j=1;j<=N;j++)
if(mx[j]==0)/*判断数据,若为零,则表示城市之间不相通或同一城市*/
mx[j]=MAXCOST;
printf("\n The 'zhuixiaoshenchenshu' is :\n ");
zxscs_sh(mx,N);/*调用函数*/
printf("\n Do you want to see the file? y / n : ");/*输出提示信息*/
getchar();
ch=getchar();
if(ch=='y')/*判断输入条件,若为Y,则表示选择显示文本文件的内容*/
{
for (i=1;i<=N;i++)
{
printf(" ");
for (j=1;j<=N;j++)
{
if(mx[j]==MAXCOST)
mx[j]=0;
printf(" %d ",mx[j]);/*输出数据*/
}
printf("\n");
}
getchar();/*控制显示*/
printf(" !EXIT by any input.");/*输出提示信息*/
getchar();
}
else
{
printf(" !EXIT by any input.");/*输出提示信息*/
getchar();
getchar();
}
}
void zxscs_sh(int c[MAXVEX][MAXVEX],int n) /*zxscs:最小生成树;给定网的顶点,数组表示对应边的权值,打印最小生成树的边和代价*/
{
int i,j,k,min,sum=0,lc[MAXVEX],location[MAXVEX];
for (i=1;i<=n;i++)
{
lc=c[1];
location=1;
} /*初始化数组*/
location[1]=0;
for (i=2;i<=n;i++)/*从U之外求离U中某一点顶点最近的顶点*/
{
min=MAXCOST; /*将MAXCOST赋给变量min*/
j=1;k=i;
while (j<=n)
{
if (lc[j]<min && location[j]!=0)
{
min=lc[j];
k=j;
}
j++;
}
sum=sum+min;/*累加求和*/
printf("\n Bian %d is :(v%d,v%d). The cost of this bian is: ( %d );\n",i-1,location[k],k,min); /*打印最小生成树的边,每条边对应的权值*/
location[k]=0; /*将顶点k并入到U中去*/
for (j=2;j<=n;j++)
if (location[j]!=0 && c[k][j]<lc[j])/*比较权的大小*/
{
lc[j]=c[k][j];
location[j]=k;
}
}
printf("\n The whole cost are: %d\n",sum);
}