閱讀54 返回首頁    go 技術社區[雲棲]


九度題目1341:艾薇兒的演唱會

題目1341:艾薇兒的演唱會(40分)

時間限製:1 秒
內存限製:32 兆
特殊判題:否
提交:412
解決:192
題目描述:
艾薇兒今天來到了中國,她計劃兩天後在哈爾濱舉行一場個人的演唱會。由於出現了緊急情況,演唱會的舉辦方要求艾薇兒提前舉行演唱會。艾薇兒現在在北京,她需要找出一條從北京到哈爾濱耗時最短的線路,以便盡快到達哈爾濱。
 中國的鐵路線非常複雜,有很多條路線可以從北京到達哈爾濱。艾薇兒在網上找到了鐵路線各個線路上所需花費的時間,但是她還是看不出來哪一條線路可以最快地到達哈爾濱。你有辦法幫助艾薇兒找出從北京到哈爾濱所需的最短時間嗎?找出來的人可以免費獲得現場演唱會門票一張哦。


輸入:
 輸入的第一行包括一個整數N(2<=N<=100),代表艾薇兒手上拿到的設有鐵路站點的城市的個數,其中城市從1到n進行編號。以及M(1<=M<=1000),代表有M條鐵路線路,每條鐵路線路隻連接兩個城市。
 接下來的一行有兩個數,a和b(1<=a,b<=N),分別表示北京和哈爾濱的編號。
 接下來有M行,每行有三個數x,y(1<=x,y<=N),t(1<=t<=1000),表示從城市x到城市y所需時間為t。


輸出:
 請輸出艾薇兒從北京到哈爾濱最少需要多長時間。你可以放心地認為肯定存在一條路線可以從北京到哈爾濱。

樣例輸入:
3 4
1 3
1 2 1
3 2 3
2 3 4
3 1 8

樣例輸出:
4

提示:
 1.火車能從城市x到城市y,就能從城市y到城市x,並且同一列火車來回所花費的時間是一樣的。如果在x和y之間有不止一輛火車通行,則不同火車從x到y或者從y到x所花費的時間可能不相同。
 2.雖然城市數有N個,但不保證所有的城市都能互相到達。可以保證的是,從北京到哈爾濱一定會有一條通路。

 

思路:典型的佛洛依德算法,隻不過有一點稍微不同的是,從x至y不止一種火車,也就是從x至y和y隻x有多種行車時間,這裏我們
要做的僅僅是取最小的那一個時間的火車就行了

AC代碼:(數據隻有一組)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define INF 0x11111111
int a[110][110],b[110][110];
void Fun()
{
     int i,j,p;
     for(i=0;i<110;i++)
     {
         for(j=0;j<110;j++)
         b[i][j]=a[i][j];
         b[i][i]=0;
     }
     for(i=0;i<110;i++)
     for(j=0;j<110;j++)
     for(p=0;p<110;p++)
     {
        if(b[j][i]+b[i][p]<b[j][p])
        {
           b[j][p]=b[j][i]+b[i][p];
        }
     }
     
}
int main()
{
    int i,j,n,m,st,en,x,y,len;
    scanf("%d %d",&n,&m);
    scanf("%d %d",&st,&en);
    memset(a,INF,sizeof(a));
    memset(b,INF,sizeof(b));
    for(i=0;i<m;i++)
    {
       scanf("%d %d %d",&x,&y,&len);
       if(a[x][y]==INF)
       {
          a[x][y]=len;
          a[y][x]=len;
       }
       else
       {
           if(len<a[x][y])
           {
              a[x][y]=len;
              a[y][x]=len;
           }
       }
    }
    Fun();
    printf("%d\n",b[st][en]);
    return 0;
}

最後更新:2017-04-03 12:56:23

  上一篇:go 線程同步之 CRITICAL_SECTION
  下一篇:go UITableView去掉最後分割線的一種方法