程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 2112 HDU Today (Dijkstra算法)

HDU 2112 HDU Today (Dijkstra算法)

編輯:C++入門知識

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;
}
這道題在輸入的處理還可以,但是沒有對算法進行優化,畢竟新學的基礎題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved