1. 程式人生 > >HDU Today HDU杭電2112【Dijkstra || SPFA】

HDU Today HDU杭電2112【Dijkstra || SPFA】

esc 眼神 inpu mark 數據 auto 結束 性格 以及

http://acm.hdu.edu.cn/showproblem.php?pid=2112
Problem 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


Hint:
The best route is:
xiasha->ShoppingCenterofHangZhou->supermarket->westlake


盡管偶爾會迷路。可是由於有了你的幫助
**和**從此還是過上了幸福的生活。

――全劇終――



#include<stdio.h>
#include<string.h>
#include<string>
#include<map>
#define INF 0x3f3f3f3f
#define N 110
using namespace std;
int Map[N][N];
int dis[10100];
bool used[10100];
int n;
int i,j;
void dijkstra(int u)
{
	memset(used,0,sizeof(used));
	memset(dis,INF,sizeof(dis));
	int pos=u;
	for(i=1;i<=100;++i)//第一次給dis賦值 
	{
		dis[i]=Map[u][i];
	}
	dis[u]=0;
	used[u]=1;
	for(i=1;i<100;++i)//最多執行一百次,由於最多有一百個公交車站
	{
		int min=INF;
		for(j=1;j<=100;++j)
		{
			if(!used[j]&&dis[j]<min)
			{
				min=dis[j];
				pos=j;
			}
		} 
		used[pos]=1;
		dis[pos]=min;
		for(j=1;j<=100;++j)//把dis數組更新,也叫松弛
		{
			if(!used[j]&&dis[j]>Map[pos][j]+dis[pos])
			{
				dis[j]=Map[pos][j]+dis[pos];
			}
		}
	}

}
int main()
{
	int m;
	int u,v,w;	
	char s1[50],s2[50];
	while(scanf("%d",&n),n!=-1)
	{		
		for(i=1;i<=100;++i)
      		for(j=1;j<=i;++j)
        		Map[i][j]=Map[j][i]=INF;
        map<string,int>mp;
        
        scanf("%s%s",s1,s2);
        bool flag=0;
        if(strcmp(s1,s2)==0) flag=1;
        mp[s1]=1;
        mp[s2]=2;
		int num=3;     
		while(n--)
		{
			scanf("%s%s%d",s1,s2,&w);
			if(!mp[s1]) mp[s1]=num++;//假設沒用過 
			if(!mp[s2]) mp[s2]=num++;
			
			Map[mp[s1]][mp[s2]]=Map[mp[s2]][mp[s1]]=w;
		}
		if(flag) printf("0\n");
		else
		{
			dijkstra(1);
			if(dis[2]==INF) printf("-1\n");
			else 
				printf("%d\n",dis[2]);
		}		
	}
	return 0;
}

//SPFA

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <map>
#include<queue>
#define M 300
#define INF 0x3f3f3f3f
using namespace std;
int Map[M][M];
int s=0, e=1;
int low[10010];
bool vis[10010];
void SPFA()
{
	int i, j;
	queue<int> Q;
	memset(low, INF, sizeof(low)); 
	memset(vis, 0, sizeof(vis));	
	vis[1] = 1;
	low[1] = 0;
	Q.push(1);
	while(!Q.empty())
	{
		int u = Q.front();
		Q.pop();
		vis[u] = 0;//出隊列了。不在隊列就變成0 
		for(i = 1; i <= 100; ++i)
		{
			
			if(low[i] > low[u] + Map[u][i])
			{
				low[i] = low[u] + Map[u][i];
				if(!vis[i])				 
			 	{
			 		vis[i]=1;
			 		Q.push(i);
			 	}
			}
		}
	}
	if(low[2] == INF) printf("-1\n");
	else printf("%d\n",low[2]);
}
int main()
{
	int N;
	char s1[40], s2[40];
	int u, v, w;
	while(scanf("%d",&N) && N != -1)
	{
		map<string,int>mp;
		int flag=0;
		for(int i=1;i<=100;++i)
			for(int j=1;j<=i;++j)
				Map[i][j]=Map[j][i]=INF;		
		scanf("%s%s",s1,s2);
		if(strcmp(s1,s2)==0) flag=1;
		mp[s1]=1;
		mp[s2]=2;
		int num=3;
		while(N--)
		{
			scanf("%s%s%d",s1,s2,&w);			
			if(!mp[s1]) mp[s1]=num++;
			if(!mp[s2]) mp[s2]=num++;
			Map[mp[s1]][mp[s2]]=Map[mp[s2]][mp[s1]]=w;
		}		
		if(flag)
		{
			printf("0\n");
			continue;
		}
		SPFA();
	}
	return 0;
}

/*
6
xiasha xiasha
xiasha station 60
xiasha ShoppingCenterofHangZhou 30
station westlake 20
ShoppingCenterofHangZhou supermarket 10
xiasha supermarket 50
supermarket westlake 10

0
*/


HDU Today HDU杭電2112【Dijkstra || SPFA】