此程序为邻接矩阵存储无向图,求其是否连通,并构建最小生成树求最短路径,请问为什么邻接矩阵值的值在输入后没有成功保存为之前输入的值?
#include<stdio.h>
#include<stdlib.h>
#define maxver 100
#define FALSE 0
#define TRUE 1
#define BIG 32768
int visited[maxver];
typedef int pathmatrix[maxver][maxver];
typedef int shortpathtable[maxver][maxver];
typedef struct{
int vertexnum;
int arcnum;
char ver[maxver];
int arc[maxver][maxver];
}lgraph;
int travergraph(lgraph G);
void depthfirstsearch(lgraph G,int i);
int Locate(lgraph G,char v)
{
int i;
for(i=0;i<G.vertexnum;i++)
if(G.ver[i]==v)
return i;
return -1;
}
void creatGraph(lgraph *G)
{
int i,j,z,u,v1,v2;
char x,y;
printf("------------------------图的创建------------------------\n");
printf("请输入顶点数和边数: \n");
scanf("%d%d",&G->vertexnum,&G->arcnum);
for(i=0;i<G->vertexnum;i++)
{
for(j=0;j<G->vertexnum;j++)
{
if(i==j)
{
G->arc[i][j]=0;
}
else
{
G->arc[i][j]=BIG;
}
}
}
printf("请输入每个顶点的名称(一个小写字母):\n");
for(i=0;i<G->vertexnum;i++)
{
printf("第%d个顶点的名称为:\n",i+1);
getchar();
scanf("%c",&(G->ver[i]));
}
printf("请输入每条边的权:\n");
for(u=0;u<G->arcnum;u++)
{
printf("请输入第%d条边的两个顶点和该边的权:\n",u+1);
printf("输入一条边的一个顶点:");
x=getchar();
getchar();
printf("输入这条边的另一个顶点:");
y=getchar();
getchar();
printf("输入这条边上的权值:");
scanf("%d",&z);
v1=Locate((*G),x);
v2=Locate((*G),y);
(*G).arc[v1][v2]=z;
(*G).arc[v2][v1]=z;
}
}
int travergraph(lgraph G)
{
int i,count=0;
for(i=0;i<G.vertexnum;i++)
{
visited[i]=FALSE;
}
for(i=0;i<G.vertexnum;i++)
{
count++;
if(!visited[i])
depthfirstsearch(G,i);
}
printf("\n");
return count;
}
void depthfirstsearch(lgraph G,int i)
{
int j;
visited[i]=TRUE;
printf("%d ",G.ver[i]);
for(j=0;j<G.vertexnum;j++)
{
if(G.arc[i][j]!=BIG&&!visited[j])
depthfirstsearch(G,j);
}
}
void tell( int count)
{
if(count==1)
{
printf("图是连通图!\n");
}
else
{
printf("图不连通!\n");
}
}
void minispantree_prim(lgraph G)
{
int min,i,j,k;
int adjvex[maxver];
int lowcost[maxver];
lowcost[0]=0;
adjvex[0]=0;
for(i=1;i<G.vertexnum;i++)
{
lowcost[i]=G.arc[0][i];
adjvex[i]=0;
}
for(i=1;i<G.vertexnum;i++)
{
min=BIG;
j=1;
k=0;
while(j<G.vertexnum)
{
if(lowcost[j]!=0&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
j++;
}
printf("(%d,%d)",adjvex[k],k);
lowcost[k]=0;
for(j=1;j<G.vertexnum;j++)
{
if(lowcost[j]!=0&&G.arc[k][j]<lowcost[j])
{
lowcost[j]=G.arc[k][j];
adjvex[j]=k;
}
}
}
printf("\n");
}
void shortestpath_floyd(lgraph G,pathmatrix *P,shortpathtable *D)
{
int v,w,k;
for(v=0;v<G.vertexnum;v++)
{
for(w=0;w<G.vertexnum;w++)
{
(*D)[v][w]=G.arc[v][w];
(*P)[v][w]=w;
}
}
for(k=0;k<G.vertexnum;k++)
{
for(v=0;v<G.vertexnum;v++)
{
for(w=0;w<G.vertexnum;w++)
{
if((*D)[v][w]>(*D)[v][k]+(*D)[k][w])
{
(*D)[v][w]=(*D)[v][k]+(*D)[k][w];
(*P)[v][w]=(*P)[v][k];
}
}
}
}
}
void printfshortpathtable(pathmatrix *P,lgraph G)
{
int i,j;
for(i=0;i<G.arcnum;i++)
{
for(j=0;j<G.arcnum;j++)
printf("%5d ",P[i][j]);
printf("\n");
}
printf("\n\n");
}
int main()
{
int a;
pathmatrix D;
shortpathtable P;
lgraph G;
creatGraph(&G);
a=travergraph(G);
tell(a);
minispantree_prim(G);
shortestpath_floyd(G,&P,&D);
printfshortpathtable(&P,G);
}