通往Mauritius的道路(典型的Dijkstra算法应用)

Lee刚刚和Meizi步入婚姻的殿堂,Meizi想坐船去Mauritius度蜜月。

这可难坏了Lee,因为各国间的航线错综复杂,各个国家航线之间的航船速度也不一定相同。由于LeeMeizi迫不及待的想去Mauritius,所以Lee希望能以最短的时间到达Mauritus。希望你能帮助Lee解决这个难题。

Input

第一行包含两个正整数,第一个为可以到达的国家数n(2<=n<=200),国家名长度不超多20个字符,第二个为航线数目m(1<=m<=n*(n-1)/2)。接下来的n行每行包含一个国家(保证有ChinaMauritius),接下来的m行每行包含两个国家和两个正整数s,vs(1000<=s<=5000)为这两个国家间航线距离,v(0<v<=200)为两个国家间航船速度。

Output

输出一行,包含一个数,即Lee带着MeiziChinaMauritius所需的最短时间(小数点后两位)。(保证一定可以到)

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


您的回应...

相关话题

查看全部

也许你感兴趣

换一批

热门标签

更多