HDU 2112 HDU Today (Dijkstra算法)
HDU Today
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13952 Accepted Submission(s): 3264
Problem Description
經過錦囊相助,海東集團終於度過了危機,從此,HDU的發展就一直順風順水,到了2050年,集團已經相當規模了,據說進入了錢江肉絲經濟開發區500強。這時候,XHD夫婦也退居了二線,並在風景秀美的諸暨市浬浦鎮陶姚村買了個房子,開始安度晚年了。
這樣住了一段時間,徐總對當地的交通還是不太了解。有時很郁悶,想去一個地方又不知道應該乘什麼公交車,在什麼地方轉車,在什麼地方下車(其實徐總自己有車,卻一定要與民同樂,這就是徐總的性格)。
徐總經常會問蹩腳的英文問路:“Can you help me?”。看著他那迷茫而又無助的眼神,熱心的你能幫幫他嗎?
請幫助他用最短的時間到達目的地(假設每一路公交車都只在起點站和終點站停,而且隨時都會開)。
Input
輸入數據有多組,每組的第一行是公交車的總數N(0<=N<=10000);
第二行有徐總的所在地start,他的目的地end;
接著有n行,每行有站名s,站名e,以及從s到e的時間整數t(0
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
雖然偶爾會迷路,但是因為有了你的幫助
**和**從此還是過上了幸福的生活。
――全劇終――
Author
lgx
Source
ACM程序設計_期末考試(時間已定!!)
Recommend
lcy | We have carefully selected several similar problems for you: 1874 1217 2680 1142 1385
主要是前期處理困難啊,不過還是想辦法搞定了。
代碼:859MS (代碼沒優化)
#include
#include
using namespace std;
#define min(a,b) (ab?a:b)
#define M 160
#define INF 0xfffff;
int dis[M],map[M][M],n;
char a[M][M];
int find(char s[])
{
int i;
for(i=1;i<=n;i++)
if(strcmp(s,a[i])==0) //如果已經出現過,就直接用下標。
return i;
strcpy(a[++n],s); //沒有出現過,就將點加入,總站數+1,該站點下標為n+1。
return n; //將現有的站點數返回。
}
void Dijkstra(int x) //模板。
{
bool v[M];
int i,j,k,minx;
memset(v,0,sizeof(v));
for(i=1;i<=n;i++)
dis[i]=map[x][i];
v[x]=1;
for(i=1;i<n;i++)
{ minx=INF;
for(j=1;j<=n;j++) //找到當前可以確定是最短路徑的點。Dijkstra的核心(貪心)。
if(!v[j] && dis[j]<minx)
{
k=j;
minx=dis[j];
}
v[k]=1;
minx=INF;
for(j=1;j<=n;j++) //更新權值,也就是當前的最短路更新。
if(!v[j] && dis[k]<minx)
{
dis[j]=min(dis[j],dis[k]+map[k][j]);
}
}
}
int main()
{
int N;
while(scanf("%d",&N),N!=-1)
{
char s[M];int r=INF;
int start,end,a,b,time,i,j;
n=0;
cin >> s; start = find(s);
cin >> s; end = find(s);
for(i=0;i<M;i++)
for(j=0;j<M;j++)
map[i][j] = (i==j? 0:r);
for(i=0;i<N;i++)
{
cin>>s; a=find(s);
cin>>s; b=find(s);
cin>>time;
map[a][b]=map[b][a]=min(map[a][b],time);
}
Dijkstra(start);
if(dis[end]!=r)
cout<<dis[end]<<endl;
else if(start==end)
cout<<"0"<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}
這道題在輸入的處理還可以,但是沒有對算法進行優化,畢竟新學的基礎題。