数据结构总结14——图5——单源最短路径 by DexterYan

一、基础知识

二、代码要求

邻接矩阵、邻接表中任选一种作为图的存储结构,采用迪杰斯特拉(Dijkstra)算法,实现指定的单源点到图中其余各顶点的最短路径(2学时)

三、算法思路分析

四、算法反思

五、代码实现

#include
#include
#define MaxVertexNum 100
#define INF 32767   //INF表示无穷 
typedef char VertexType;
typedef int EdgeType;

typedef struct
{
	VertexType vexs[MaxVertexNum];//顶点表
	EdgeType edges[MaxVertexNum][MaxVertexNum];//边表,邻接矩阵 
	int n,e;//顶点数和边数 
}MGraph;//以邻接矩阵存储图类型

struct node
{
	int adjvex;
	int lowcost;		//存储该边上的权 
}closedge[MaxVertexNum];//一维辅助数组,记录从U到U-V具有最小权值的边 (U是生成树顶点集合) 

int visited[MaxVertexNum];

int CreateMGraph(MGraph *G)//建立图的邻接矩阵 
{
	int i, j, k, weight;
	printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n");
	scanf("%d,%d",&(G->n),&(G->e));//输入顶点数和边数				/*这G->n不加括号括起来有无影响?*/
	printf("请输入顶点信息(输入格式为:<回车>顶点号):\n");
	for(i=0; in; i++)
	{
		scanf("\n%c",&(G->vexs[i]));//输入顶点信息,顶点集 
	}
	for(i=0; in; i++)
	{
		for(j=0; jn; j++)
		{
			G->edges[i][j]=INF;//初始化邻接矩阵 
		}
	}
	printf("请输入每条边对应的两个顶点的序号和对应的权值(输入格式为:i,j,weight):\n");
	for(k=0; ke; k++)
	{
		scanf("%d,%d,%d",&i,&j,&weight);
		G->edges[i][j]=weight;//若此处加入G->deges[j][i]=1,则为无向图的邻接矩阵存储建立 
	//	G->edges[j][i]=weight;
	}
	/*用来显示邻接矩阵,检测创建是否正确 
	for(i=0; in; i++)
	{
		for(j=0; jn; j++)
		{
			printf("(%d)",G->edges[i][j]);
		}
		printf("\n");
	}
	*/
}

void dispath(int dist[],int path[],int s[],int n,int v)
{
	int i,k;
	for(i=0; in; i++)
	{
		dist[i]=G->edges[v][i];//距离初始化 
		s[i]=0;					//s数组初始化,0表示未找到最短路径 
		if(G->edges[v][i]n; i++)//重复,直到求出v到其余所有顶点的最短路径 
	{
		mindis=INF;
		k=v;
		for(j=0; jn; j++)//从V-S中选取具有最小距离的顶点vk 
		{
			if(s[j]==0&&dist[j]n; j++)//修改V-S中顶点的距离dist[j] 
		{
			if(s[j]==0&&G->edges[k][j]edges[k][j]edges[k][j];
				path[j]=k;
			}
		}
	}
	dist[v]=0; 
	dispath(dist,path,s,G->n,v);//输出最短路径 
}

int main()
{
	MGraph x;
	int start;
	CreateMGraph(&x);
	printf("请输入起始顶点:");
	scanf("%d",&start); 
	dijkstra(&x,start);
	return 0;
}

六、代码反思

脑残bug
1、scanf里边是不能有其他字符的,比如 scanf(“请输入起始顶点:%d”,&start); 这样非但不能不显示字符,还会影响赋值的过程

你可能感兴趣的:(数据结构)