1. 程式人生 > >最短路徑演算法之Dijkstra演算法(鄰接矩陣實現)

最短路徑演算法之Dijkstra演算法(鄰接矩陣實現)

如題,很簡單的最短路徑,除了要利用map先將字串轉成數字,注意可能出發地目的地相同!!!!

Description

經過錦囊相助,海東集團終於度過了危機,從此,HDU的發展就一直順風順水,到了2050年,集團已經相當規模了,據說進入了錢江肉絲經濟開發區500強。這時候,XHD夫婦也退居了二線,並在風景秀美的諸暨市�浦鎮陶姚村買了個房子,開始安度晚年了。
這樣住了一段時間,徐總對當地的交通還是不太瞭解。有時很鬱悶,想去一個地方又不知道應該乘什麼公交車,在什麼地方轉車,在什麼地方下車(其實徐總自己有車,卻一定要與民同樂,這就是徐總的性格)。
徐總經常會問蹩腳的英文問路:“Can you help me?”。看著他那迷茫而又無助的眼神,熱心的你能幫幫他嗎?
請幫助他用最短的時間到達目的地(假設每一路公交車都只在起點站和終點站停,而且隨時都會開)。

Input

輸入資料有多組,每組的第一行是公交車的總數N(0<=N<=10000);
第二行有徐總的所在地start,他的目的地end;
接著有n行,每行有站名s,站名e,以及從s到e的時間整數t(0<t<100)(每個地名是一個長度不超過30的字串)。
note:一組資料中地名數不會超過150個。
如果N==-1,表示輸入結束。

Output

如果徐總能到達目的地,輸出最短的時間;否則,輸出“-1”。

Sample Input

6 xiasha westlake xiasha station 60 xiasha ShoppingCenterofHangZhou 30 station westlake 20 ShoppingCenterofHangZhou supermarket 10 xiasha supermarket 50 supermarket westlake 10 -1

Sample Output

50
#include<iostream>
#include<cstring>
#include<cmath>
#include<map> 
using namespace std;
int m[155][155];
int inf=2000000000;
int main(){
	int n;
	string s1,s2;
	while(cin>>n&&n!=-1){
		for (int i=0;i<155;i++){
			for (int j=0;j<155;j++){
				if (i==j) m[i][j]=0;
				else m[i][j]=inf;
			}
		}
		int count=1;
		int num;
		map<string,int> my;
		cin>>s1>>s2;
		bool f=true;
		if (s1==s2) f=false;
		my[s1]=count++;
		my[s2]=count++;
		for (int i=0;i<n;i++){
			cin>>s1>>s2>>num;
			if (my[s1]==0){
				my[s1]=count++;
			}
			if (my[s2]==0){
				my[s2]=count++;
			}
			m[my[s1]][my[s2]]=m[my[s2]][my[s1]]=num;
			
		}
		if (!f) {		//出發地目的地相同,直接輸出 
			printf("0\n");
			continue;	
		}
		int dis[155];
		for (int i=1;i<155;i++){
			dis[i]=m[1][i];
		}
		int book[155]={0};
		book[1]=1;
		int mini,u;
		for (int i=1;i<count-1;i++){
			mini=inf;
			for (int j=1;j<count;j++){
				if (book[j]==0&&dis[j]<mini){
					mini=dis[j];
					u=j;
				}
			}
			book[u]=1;
			for (int v=1;v<count;v++){
				if (m[u][v]<inf){
					if (dis[v]>dis[u]+m[u][v]){
						dis[v]=dis[u]+m[u][v];
					}
				}
			}
		}
		
		if (dis[2]==inf) cout<<-1<<endl; 
		else cout<<dis[2]<<endl;
	}	
}