使用邻接矩阵来记录图。
图中各点的关系需要自己看下矩阵了。
代码如下:
#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;
}
运行效果: