最近看了一道华为的上机例题,想了好久,最后还是参考网上的代码实现了,感觉数据结构
这个东西稍微已不用就忘得差不多了,唉~~
不多说了,贴代码先
#include <cstdlib> #include <iostream> #include <string> /* Author : 俗人 Time : 2013/9/2 description : 地铁换乘问题 已知2条地铁线路,其中A为环线,B为东西向线路,线路均为双向, 换乘点为 T1,T2,编写程序,任意输入两个站点名称,输出乘坐地铁 最少所需要经过的车站数量 A(环线):A1...A9 T1 A10...A13 T2 A14...A18 B(直线):B1...B5 T1 B6...B10 T2 B11...B15 样例输入:A1 A3 样例输出:3 */ using namespace std; //无向图的数据结构 struct Graph { int arrArc[100][100]; //邻接矩阵 int verCount; //点数 int arcCount; //边数 }; //FLOYD算法 求任意两点最短路径矩阵 void floyd(Graph *p,int dis[100][100]){ for(int k = 1;k <= p->verCount;k++) for(int i = 1; i <= p->verCount;i++) for(int j = 1;j <= p->verCount;j++) { //存在更近的路径,则更新 if(dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j]; } } //站名字符串转节点编号 int char_to_int(string s){ string s1[38] = {"A0","A1","A2","A3","A4","A5","A6","A7","A8","A9","A10", "A11","A12","A13","A14","A15","A16","A17","A18", "B1","B2","B3","B4","B5","B6","B7","B8","B9","B10", "B11","B12","B13","B14","B15","T1","T2"} ; for(int i=1 ; i <= 38;i ++){ if (s == s1[i]) return i; } return -1; } int main(int argc, char *argv[]) { Graph g; g.verCount = 37; g.arcCount = 35; cout<<"number of ver:"<<g.verCount<<" number of arc:" <<g.arcCount<<endl; //初始化邻接矩阵 for(int i = 1;i<=g.verCount;i++) { for(int j = 1;j<=g.verCount;j++) { //i到本身的距离为0 //不同节点值为不可达 if(i==j) g.arrArc[i][i]= 0; else g.arrArc[i][j] = 65535; } } //输入A环线个点相连情况 每个边权重都为1 int a[21] = {1,2,3,4,5,6,7,8,9,34,10,11,12,13,35,14,15,16,17,18,1}; for(int i=0;i<20;i++) { g.arrArc[a[i]][a[i+1]] = 1; g.arrArc[a[i+1]][a[i]] = 1; } //输入B线个点相连情况 每个边权重都为1 int b[17] = {19,20,21,22,23,34,24,25,26,27,28,35,29,30,31,32,33}; for(int i=0;i<16;i++) { g.arrArc[b[i]][b[i+1]] = 1; g.arrArc[b[i+1]][b[i]] = 1; } //计算邻接矩阵 floyd(&g,g.arrArc); cout << "请输入起始站点:" <<endl; string start; string end; cin >> start >> end; cout << g.arrArc[char_to_int(start)][char_to_int(end)] <<endl; system("PAUSE"); return EXIT_SUCCESS; }
参考链接:http://blog.csdn.net/perfect2011/article/details/7568375
Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能:
1是直接从A到B,
2是从A经过若干个节点X到B。
所以,我们假设dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查dis(AX) + dis(XB) < dis(AB)是否成立,如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置dis(AB)= dis(AX) +dis(XB),这样一来,当我们遍历完所有节点X,dis(AB)中记录的便是A到B的最短路径的距离。