已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量.

已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。
地铁线A(环线)经过车站:A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18
地铁线B(直线)经过车站:B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15

利用BFS求最短路径,BFS只适用于无权路径,有权路径很难使用

#include <iostream>
#include <string>
#include <queue>
using namespace std;

typedef struct EdgeNode
{
	int adjvex;
	struct EdgeNode *next;
}EdgeNode;

typedef struct VertexNode
{
	string data;
	EdgeNode *first;
}VertexNode,AdjList[20];

typedef struct Graph
{
	AdjList vertex;
	int num_vertex;
	int num_edge;
}Graph;

int visit[20];
int parent[20];
int num = 0;

int get_location(Graph g, string s)
{
	for(int i=0;i<g.num_vertex;i++)
	{
		if(s == g.vertex[i].data)
			return i;
	}
	return -1;
}

void create_graph(Graph &g)
{
	int i,j,k;
	string s1,s2;
	cout<<"请输入结点和边的个数:";
	cin>>g.num_vertex>>g.num_edge;
	cout<<"请输入节点:";
	for(i=0;i<g.num_vertex;i++)
	{
		cin>>g.vertex[i].data;
		g.vertex[i].first = NULL;
	}
	cout<<"请输入边:"<<endl;
	for(k=0;k<g.num_edge;k++)
	{
		cin>>s1>>s2;
		i = get_location(g,s1);
		j = get_location(g,s2);
		EdgeNode *p = new EdgeNode();
		p->adjvex = j;
		p->next = g.vertex[i].first;
		g.vertex[i].first = p;

		p = new EdgeNode();
		p->adjvex = i;
		p->next = g.vertex[j].first;
		g.vertex[j].first = p;
	}
}

void dfs(Graph g, string begin, string end)
{
	int start = get_location(g,begin);
	int stop = get_location(g,end);
	queue<int> q;
	memset(visit,0,sizeof(visit));
	memset(parent,-1,sizeof(parent));
	visit[start] = 1;
	parent[start] = -1;
	q.push(start);
	while(!q.empty())
	{
		int top = q.front();
		q.pop();
		EdgeNode *p = g.vertex[top].first;
		while(p)
		{	
			if(!visit[p->adjvex])
			{
				visit[p->adjvex] = 1;
				parent[p->adjvex] = top;
				if(p->adjvex == stop) //找到返回
					return;
				q.push(p->adjvex);
			}
			p = p->next;
		}
	}
}

void print_path(Graph g, int end)
{
	if(parent[end] != -1)
	{
		num++;
		print_path(g,parent[end]);
		cout<<"->"<<g.vertex[end].data;
	}
}

void print_path(Graph g, string begin, string end)
{
	cout<<"最短路径为:"<<endl;
	cout<<begin<<"->";
	num++;
	int j = get_location(g,end);
	print_path(g,j);
	cout<<endl;
	cout<<"最短路径长度为"<<num<<endl;
}

int main()
{
	Graph g;
	string begin,end;
	create_graph(g);
	cout<<"请输入要找的起始站点:";
	cin>>begin>>end;
	dfs(g,begin,end);
	print_path(g,begin,end);
	return 0;
}


已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量._第1张图片

已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量._第2张图片

你可能感兴趣的:(已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量.)