杭電 2066 一個人的旅行

來源:互聯網
上載者:User

標籤:杭電   2066一個人的旅行   最短路問題   

一個人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 18044    Accepted Submission(s): 6266


Problem Description雖然草兒是個路癡(就是在杭電待了一年多,居然還會在校園裡迷路的人,汗~),但是草兒仍然很喜歡旅行,因為在旅途中 會遇見很多人(白馬王子,^0^),很多事,還能豐富自己的閱曆,還可以看美麗的風景……草兒想去很多地方,她想要去東京鐵塔看夜景,去威尼斯看電影,去陽明山上看海芋,去紐約純粹看雪景,去巴黎喝咖啡寫信,去北京探望孟薑女……眼看寒假就快到了,這麼一大段時間,可不能浪費啊,一定要給自己好好的放個假,可是也不能荒廢了訓練啊,所以草兒決定在要在最短的時間去一個自己想去的地方!因為草兒的家在一個小鎮上,沒有火車經過,所以她只能去鄰近的城市坐火車(好可憐啊~)。
Input輸入資料有多組,每組的第一行是三個整數T,S和D,表示有T條路,和草兒家相鄰的城市的有S個,草兒想去的地方有D個;
接著有T行,每行有三個整數a,b,time,表示a,b城市之間的車程是time小時;(1=<(a,b)<=1000;a,b 之間可能有多條路)
接著的第T+1行有S個數,表示和草兒家相連的城市;
接著的第T+2行有D個數,表示草兒想去地方。
Output輸出草兒能去某個喜歡的城市的最短時間。
Sample Input
6 2 31 3 51 4 72 8 123 8 44 9 129 10 21 28 9 10

Sample Output
9

 

這道題也是最短路的問題,這道題我是把起點看為草兒的家,她的家到相鄰的城市的花費時間為0,並不會影響最終結果,這樣也避免了多重迴圈,導致逾時。

代碼:

#include<stdio.h>
#include<string.h>

#define INF 1 << 30

int a = 0 , b = 0 , time = 0 ;

int dis[1001] ;//用來記錄時間,並更新

int map[1001][1001] ;//用來記錄兩個點之間的距離

int c[1001] ;//用來記錄終點

int max = 0 ; // 用來記錄最大的那個標號

int used[1001] ; //用來標記

//輸入函數,並存圖
void input(int T,int S,int D)
{
 int i = 0 ,j = 0 ;
 for(i = 0 ; i < 1001 ; i++)
 {
  for(j = 0 ;j < 1001 ; j++)
  {
   map[i][j] = INF ;
  }
  dis[i] = INF ;
  used[i] = 0 ;
 }
 for(i = 0 ; i < T ; i++)
 {
  scanf("%d%d%d",&a,&b,&time);
  if(map[a][b] > time)
  {
   map[a][b] = time ;
   map[b][a] = time ;
  }
  max = max > a ? max : a ;
  max = max > b ? max : b ;
 }
 for(i = 0 ; i < S ; i++)
 {
  int x = 0 ;
  scanf("%d",&x);
  map[0][x] = 0 ;
 }
 for(i = 0 ; i < D ; i++)
  scanf("%d",&c[i]);
}

void dijstra(int n )
{
    int i = 0 ,j = 0 ;
 bool r ;
 int c = 0 ;
 for( i = 0 ; i <= n ; i++)
 {
  r = false ;
        int min = INF ;
  //尋找所花費時間最短的點
        for(j = 0 ; j <= n ; j++)
  {
   if(!used[j] && min > dis[j])
   {
                r = true ;
    min = dis[j] ;
    c = j ;
   } 
  }
  //如果沒有找到該點則代表所有點的最短路已求完
  if(!r)
   return  ;
  //否則標記該點
  used[c] = 1 ;
  //鬆弛操作
  for(j = 0 ; j <= n ; j++)
  {
   if(!used[j] && dis[j] > dis[c] + map[c][j])
    dis[j] = dis[c] + map[c][j] ;
  }
 }
}

int main()
{
 int T , S , D ;
 while(~scanf("%d%d%d" , &T , &S , &D))
 {
  if(D == 0)
   printf("0\n");
  int i = 0 , j = 0 ;
  max = 0 ;
  int m = INF ;
  input(T , S , D);
  for(i = 0 ; i < D ; i++)
  {
   dis[0] = 0 ;
      dijstra( max );
   if(m  > dis[c[i]])
    m = dis[c[i]] ;
  }
  printf("%d\n",m);
  memset(map,0,sizeof(map)) ;
  memset(c,0,sizeof(c)) ;
 }
 return 0 ;
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.