#include "stdafx.h"
#include <iostream>
#include <assert.h>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
using namespace std;
typedef int PATH[35][35];
typedef int VERTEX[35][35];
const int NIF = 65535;
typedef struct
{
int (*arc)[35];
int NumVertexes;
}Graph; //定义
const char *RouteTable[35]={"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"}; //路径表
void ShortestPath_Floyd(Graph *pGraph,PATH *path,VERTEX *vertex) //最短路径算法,可以得到最短路径的路径长度和路径
{
int i,j,k;
for (i=0;i<pGraph->NumVertexes;++i)
{
for (j=0;j<pGraph->NumVertexes;++j)
{
(*path)[i][j] = pGraph->arc[i][j];//将原图复制给path
(*vertex)[i][j]= j; //初始化顶点矩阵
}
}
for (k=0;k<pGraph->NumVertexes;++k)
{
for (i=0;i<pGraph->NumVertexes;++i)
{
for (j=0;j<pGraph->NumVertexes;++j)
{
if ((*path)[i][j]>(*path)[i][k]+(*path)[k][j])
{
(*path)[i][j] = (*path)[i][k]+(*path)[k][j];
(*vertex)[i][j] = (*vertex)[i][k];
}
}
}
}
}
void Route_path_show(int path[][35],int vertex[][35],int start,int end) //显示函数
{
int k = vertex[start][end];
cout<<"最少所经过的站点数: "<<path[start][end]+1<<endl;
cout<<"所经路径 : "<<RouteTable[start]<<"->";
while (k!=end)
{
cout<<RouteTable[k]<<"->";
k = vertex[k][end];
}
cout<<RouteTable[end]<<endl;
}
void GraphCreat(Graph **pGraph,int arc[][35]) //根据题意创建连接图
{
int i,j;
for (i=0;i<35;++i)
{
for (j=0;j<35;++j)
{
if(i==j)
arc[i][j] = 0;
else
arc[i][j] = NIF;
}
}
(*pGraph)->NumVertexes = 35;
int a[]={1,2,3,4,5,6,7,8,9,34,10,11,12,13,35,14,15,16,17,18,1};//环线
int b[]={19,20,21,22,23,34,24,25,26,27,28,35,29,30,31,32,33}; //T1:34,T2:35
int length_a = sizeof(a)/sizeof(a[0]);
int length_b = sizeof(b)/sizeof(b[0]);
for (i=0;i<length_a-1;++i)
{
arc[a[i]-1][a[i+1]-1]=1;
arc[a[i+1]-1][a[i]-1]=1;//初始化A路线连接矩阵,权重都为1
}
for (i=0;i<length_b-1;++i)
{
arc[b[i]-1][b[i+1]-1]=1;
arc[b[i+1]-1][b[i]-1]=1;//初始化B路线连接矩阵,权重都为1
}
(*pGraph)->arc = arc;
}
int char_to_num(char *str)
{
int i=0;
while (i<35)
{
if (strcmp(str,RouteTable[i])==0)
{
return i;
break;
}
++i;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Graph *pGraph = new Graph;
int arc[35][35];
GraphCreat(&pGraph,arc);
int path[35][35];
int vertex[35][35];
ShortestPath_Floyd(pGraph,&path,&vertex);
char input[100];
char *pInput = input;
char *mid,*low,*high;
char start[10],end[10];
int begin,stop;
while (1)
{
cout<<"******************************************************************************"<<endl;
cout<<"请输入起点和终点.格式:[A1,A2]"<<endl;
cout<<"输入范围:"<<"A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 B1 B2 B3 ";
cout<<"B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 T1 T2"<<endl;
cin>>input;
pInput = input;
if (strcmp(pInput,"q")==0)
break;
else
{
while (*pInput!=']')
{
if(*pInput=='[')
low = pInput+1;
if (*pInput==',')
mid = pInput;
++pInput;
}
high = pInput-1;
memcpy(start,low,mid-low);
start[mid-low]='\0';
memcpy(end,mid+1,high-mid);
end[high-mid]='\0';
begin = char_to_num(start);
stop = char_to_num(end);
Route_path_show(path,vertex,begin,stop);
}
}
delete pGraph;
system("pause");
return 0;
}