已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量.
2013-08-31 22:41
507 查看
已知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只适用于无权路径,有权路径很难使用
地铁线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为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。 编写程序,任意输入两个站点名称,输出最少需要经过的站点数
- 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。 比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。
- 输入任意大小的三个整数,判断其中是否有两个奇数一个偶数。若是,则输出“YES”,不是则输出“NOT” (要求用条件表达式进行判断,不使用if语句)
- 输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。 为了简单起见,我们假设push序列的任意两个整数都是不相等的
- 输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。 为了简单起见,我们假设push序列的任意两个整数都是不相等的
- 编程题:用一组数组做函数参数来实现,输入两个数,输出其中最大数
- 输入数独题目,程序输出数独的唯一解。保证所有已知数据的格式都是合法的,并且题目有唯一的解。
- 《剑指Offer》输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 从键盘输入任意个数字,以0为结尾,输出其中最大值
- 51.从键盘上输入任意两个数和一个运算符(+、-、*、/),根据输入的运算符对两个数计算,并输出结果
- 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 7.4.采用穷举法,用函数编程实现计算两个正整数的最小公倍数的函数,在主函数中调用该函数计算并输出从键盘任意输入的两个数的最小公倍数。
- 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
- 编程珠玑: 12章 取样问题 12.1程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。 优化解法-------解题总结
- 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
- 编写一个程序,对用户输入的任意一组数字字符如{3,1,4,7,2,1,1,2,2},输出其中出现次数最多的字符,并显示其出现次数。如果有多个字符出现次数均为最大且相等,则输出最先出现的那个字符和它出现
- 编程珠玑: 12章 取样问题 12.3设计空间,程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。 -------解题总结
- 1、 编写一个Java应用程序,对用户输入的任意一组字符如{1,3,4,7,2,1,1,5,2},输出其中出现次数最多且数值最大的字符,并显示其出现次数。