Lee刚刚和Meizi步入婚姻的殿堂,Meizi想坐船去Mauritius度蜜月。
这可难坏了Lee,因为各国间的航线错综复杂,各个国家航线之间的航船速度也不一定相同。由于Lee的Meizi迫不及待的想去Mauritius,所以Lee希望能以最短的时间到达Mauritus。希望你能帮助Lee解决这个难题。
Input
第一行包含两个正整数,第一个为可以到达的国家数n(2<=n<=200),国家名长度不超多20个字符,第二个为航线数目m(1<=m<=n*(n-1)/2)。接下来的n行每行包含一个国家(保证有China和Mauritius),接下来的m行每行包含两个国家和两个正整数s,v,s(1000<=s<=5000)为这两个国家间航线距离,v(0<v<=200)为两个国家间航船速度。
Output
输出一行,包含一个数,即Lee带着Meizi从China到Mauritius所需的最短时间(小数点后两位)。(保证一定可以到)
Sample Input
4 4
China
Italy
Mauritius
Spain
China Italy 5000 100
Italy Spain 2000 100
Spain Mauritius 500030
China Mauritius 5000 1
// Lee_travel.cpp : 定义控制台应用程序的入口点。
//使用Dijkstra算法求最短路径,时间为权值
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 0
#define ERROR 1
#define YES 1
#define NO 0
#define MAX_VEX 200
#define MAX_COST 999
#define status int
typedef struct ArcCell
{
float cost;
}ArcCell,AdjMatrix[MAX_VEX][MAX_VEX];
typedef struct Graph
{
char vexs[MAX_VEX][20];
AdjMatrix arc;
int vexnum,arcnum;
}Graph;
status Creat_Graph(Graph &G);//创建图
float Dijkstra(Graph G,int start_vex,int reach_vex);
int IndexOf(Graph G,char *ch);//求名字为ch的地点在图G中的索引值
int _tmain(int argc, _TCHAR* argv[])
{
Graph G;
if(Creat_Graph(G)!=ERROR)
{//创建成功开始搜索
char *a="China";
char *b="Mauritius";
printf("%.2f",Dijkstra(G,IndexOf(G,a),IndexOf(G,b)));
}
else
{//创建失败
printf("创建图失败\n");
}
system("pause");
return 0;
}
status Creat_Graph(Graph &G)
{
int i,j;
int length,speed;
char start[20],reach[20];
scanf("%d %d",&G.vexnum,&G.arcnum);//输入定点数和弧数
if(G.vexnum<2||G.vexnum>200||G.arcnum<1||G.arcnum>G.vexnum*(G.vexnum-1)/2)
{
printf("定点数违法,请输入值[2,200]\n");
return ERROR;
}
for(i=0;i<G.vexnum;i++)//初始化邻接矩阵
for(j=0;j<G.vexnum;j++)
G.arc[i][j].cost=MAX_COST;
for(i=0;i<G.vexnum;i++)//输入每个顶点的名称
scanf("%s",G.vexs[i]);
for(j=0;j<G.arcnum;j++)
{
scanf("%s",start);
start[strlen(start)]='\0';
getchar();
scanf("%s",reach);
reach[strlen(reach)]='\0';
getchar();
scanf("%d %d",&length,&speed);
if(length>=100&&length<=5000&&speed>0&&speed<=200)
if(IndexOf(G,start)<G.vexnum&&IndexOf(G,reach)<G.vexnum)
G.arc[IndexOf(G,start)][IndexOf(G,reach)].cost=(float)length/(float)speed;
else
{
printf("地名输入有误\n");
return ERROR;
}
else
{
printf("距离:[1000,5000] 速度:(0,200]\n");
return ERROR;
}
}
return OK;
}
float Dijkstra(Graph G,int start_vex,int reach_vex)
{
int i,j;
int selected[MAX_VEX];
float min_cost;
int min_vex;
float lowpathcost[MAX_VEX];
for(i=0;i<G.vexnum;i++)
{
selected[i]=NO;
lowpathcost[i]=G.arc[start_vex][i].cost;
}
selected[start_vex]=YES;
//for(i=start_vex;i!=(start_vex-1+G.vexnum)%G.vexnum;i=(i+1)%G.vexnum)
for(i=0;i<G.vexnum;i++)
{
min_cost=MAX_COST;
for(j=0;j<G.vexnum;j++)//寻找权值最小点
if(lowpathcost[j]<min_cost&&selected[j]==NO)
{
min_cost=lowpathcost[j];
min_vex=j;
}
selected[min_vex]=YES;//更改标志位
for(j=0;j<G.vexnum;j++)//更新lowpathcost
if(selected[j]==NO&&G.arc[min_vex][j].cost<MAX_COST&&lowpathcost[j]>min_cost+G.arc[min_vex][j].cost)
lowpathcost[j]=min_cost+G.arc[min_vex][j].cost;
}
return lowpathcost[reach_vex];
}
int IndexOf(Graph G,char *ch)
{
int i;
for(i=0;i<G.vexnum;i++)
if(strcmp(ch,G.vexs[i])==0)
break;
return i;
}