Dijkstral最短路径

使用邻接矩阵来记录图。

图中各点的关系需要自己看下矩阵了。

代码如下:

#include<iostream>
#include<stdio.h>
#include<queue>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
using namespace std;
typedef struct note{
int x;//城市标号
int s;//换乘次数
}Node;
queue<Node> Q;//申明一个队列,Node型的队列
	int Matrix[8][8];//声明一个二维数组用来构建邻接矩阵
	int Mark[8];//用来放置标志信息
	int trace[8];//用来记录回溯信息
	char const *str[]={" ","北京","上海","杭州","广州","南昌","武汉","成都"};
void init(){//图初始化
	int i,j;
	for(i=1;i<=7;i++)
		for(j=1;j<=7;j++)
			if(i==j) Matrix[i][j]=0;
			else Matrix[i][j]=99999999;
	Matrix[1][2]=1;
	Matrix[2][1]=1;
	Matrix[1][6]=1;
	Matrix[6][1]=1;
	Matrix[1][7]=1;
	Matrix[7][1]=1;//BJ
	Matrix[2][5]=1;
	Matrix[5][2]=1;
	Matrix[2][3]=1;
	Matrix[3][2]=1;//SH
	Matrix[3][6]=1;
	Matrix[6][3]=1;
	Matrix[3][4]=1;
	Matrix[4][3]=1;//HZ
	Matrix[4][5]=1;
	Matrix[5][4]=1;
	Matrix[4][7]=1;
	Matrix[7][4]=1;//GD
	Matrix[6][7]=1;
	Matrix[7][6]=1;
	for(i=1;i<=8;i++)
		trace[i]=-1;
	}
int Switch(char s[])
{
	if(strcmp(s,"BJ")==0) return 1;
	if(strcmp(s,"SH")==0) return 2;
	if(strcmp(s,"HZ")==0) return 3;
	if(strcmp(s,"GZ")==0) return 4;
	if(strcmp(s,"NC")==0) return 5;
	if(strcmp(s,"WH")==0) return 6;
    if(strcmp(s,"CD")==0) return 7;
	return 999;
}
int main()
{
	init();
	printf("请输入您想要查询的起点和终点:");
	char B1[4];
	char B2[4];
	scanf("%s %s",&B1,&B2);
	int flag=0;
	int end,start;
	start=Switch(B1);//将字符转换为对应的下标
	if(start==999)
	{
	printf("Input error!");
	return 0;
	}
	end=Switch(B2);
	if(end==999)
	{
	printf("Input error!");
	return 0;
	}
	int cur;
	int i,j;
	Node temp;
	temp.x=start;
	temp.s=0;
	Q.push(temp);
	Mark[start]=1;
	while(!Q.empty())//队列不为空则继续搜索
	{
		cur=Q.front().x;//当前搜索的顶点
		for(j=1;j<=7;j++)
		{	if(Matrix[cur][j]!=99999999&&Mark[j]==0)
			{
			trace[j]=cur;//记录J顶点是被CUR搜索的
			temp.x=j;
			temp.s=Q.front().s+1;
			Q.push(temp);//当前顶点入队
			Mark[j]=1;//标志已经遍历
			}
		if(Q.back().x==end)//如果已经遍历到了终点则跳出
			{
			flag=1;
			break;//此时是跳出for循环,还需一个flag标志,便于接下来的判定跳出大循环,终止遍历
			}
	}
		if(flag==1)
			break;
		Q.pop();//当前顶点的邻接点已经遍历完,出队
	}
	
	int count=1;
	int record[8];
	record[0]=j;
	while(trace[j]!=-1)
	{
	record[count++]=trace[j];//从J开始回溯它之前走过的某条路径
	j=trace[j];
	}
	printf("%s 到 %s 的最小乘车次数为:%d",str[start],str[end],Q.back().s);
	printf("\n");
	printf("乘车的路径为:");
	for(i=count-1;i>=0;i--)
	{
	printf(" %s ",str[record[i]]);
	if(i!=0)
	printf("—>");
	}
	getchar();
	getchar();
	return 0;
}

运行效果:

猜你喜欢

转载自blog.csdn.net/yoonaanna/article/details/123435109
今日推荐