阅读54 返回首页    go 阿里云 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去掉最后分割线的一种方法