无向图的邻接矩阵问题,虚心求教。

此程序为邻接矩阵存储无向图,求其是否连通,并构建最小生成树求最短路径,请问为什么邻接矩阵值的值在输入后没有成功保存为之前输入的值?

#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);
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值