已知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; }