• [NOIP2010冲刺十三] 逃离遗迹


                                                 [NOIP2010冲刺十三] 逃离遗迹

    【题目描述】

    根据外星人的回信,在遗迹分布着三样道具。当三样道具都拿走后,遗迹就很快自动毁灭,所以必须要在最短时间内离开。遗迹可以看作是由N个房间(编号1..N)和N-l条长度不等通道所组成,并且任意两个房间之间有且只有一条路可以相互到达。现在我们的队员已经在编号为A,B,C的房间内拿到道具,并且准备撤退。由于只有一架直升机,所以只能在一个房间上停留。现在请你决定将直升机停在哪一个房间之上,能够使三人到达该房间的距离之和最短。

    【输入格式】

     第1行:四个整数N、A、B、C。

     第2..N行:每行三个整数u,v,w,表示存在连接房间u,v的通道,长度w。

    【输出格式】

     第1行:一个整数,表示汇合房间的编号。若存在多个解,输出字典序最小的。

     第2行:一个整数,表示三人到该房间距离之和。

    【样例输入】

    5 3 1 4
    3 5 5
    4 3 9
    4 1 7
    1 2 1
    

    【样例输出】

    4
    16
    

    【提示】

    对于50%的数据:1≤N≤1,000。 

    对于100%的数据:1≤N≤20,000。 1≤A,B,C,u,v<=N且A,B,C不相等;u,v不相等。 1≤w≤1,000。

    三遍SPFA

    0.000s

    rank1毫无压力

     1 #include <queue>
     2 #include <cstdio>
     3 #include <cctype>
     4 
     5 const int MAXN=20010;
     6 const int INF=0x3f3f3f3f;
     7 
     8 int n,S1,S2,S3;
     9 
    10 int dis[MAXN],dis2[MAXN],dis3[MAXN];
    11 
    12 bool vis[MAXN];
    13 
    14 struct node {
    15     int to;
    16     int val;
    17     int next;
    18 };
    19 node e[MAXN<<1];
    20 
    21 int head[MAXN],tot;
    22 
    23 inline void read(int&x) {
    24     int f=1;register char c=getchar();
    25     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
    26     for(;isdigit(c);x=x*10+c-48,c=getchar());
    27     x=x*f;
    28 }
    29 
    30 inline void add(int x,int y,int v) {
    31     e[++tot].to=y;
    32     e[tot].val=v;
    33     e[tot].next=head[x];
    34     head[x]=tot;
    35 }
    36 
    37 void SPFA(int s,int*a) {
    38     std::queue<int> Q;
    39     for(int i=1;i<=n;++i) vis[i]=false;
    40     Q.push(s);
    41     a[s]=0;
    42     while(!Q.empty()) {
    43         int u=Q.front();
    44         Q.pop();
    45         for(int i=head[u];i;i=e[i].next) {
    46             int v=e[i].to;
    47             if(a[v]>a[u]+e[i].val) {
    48                 a[v]=a[u]+e[i].val;
    49                 if(!vis[v]) Q.push(v),vis[v]=true;
    50             }
    51         }
    52     }
    53     return;
    54 }
    55 
    56 int hh() {
    57     freopen("escapeb.in","r",stdin);
    58     freopen("escapeb.out","w",stdout);
    59     int x,y,z;
    60     read(n);read(S1);read(S2);read(S3);
    61     for(int i=1;i<n;++i) {
    62         read(x);read(y);read(z);
    63         add(x,y,z);add(y,x,z);
    64     }
    65     for(int i=1;i<=n;++i) dis[i]=dis2[i]=dis3[i]=INF;
    66     SPFA(S1,dis);SPFA(S2,dis2);SPFA(S3,dis3);
    67     int ans=INF,pos;
    68     for(int i=1;i<=n;++i) 
    69       if(ans>dis[i]+dis2[i]+dis3[i]) pos=i,ans=dis[i]+dis2[i]+dis3[i];
    70     printf("%d
    %d
    ",pos,ans);
    71     return 0;
    72 }
    73 
    74 int sb=hh();
    75 int main() {;}
    代码


    作者:乌鸦坐飞机
    出处:http://www.cnblogs.com/whistle13326/
    新的风暴已经出现 怎么能够停止不前 穿越时空 竭尽全力 我会来到你身边 微笑面对危险 梦想成真不会遥远 鼓起勇气 坚定向前 奇迹一定会出现

     
  • 相关阅读:
    PO BO VO DTO POJO DAO DO这些Java中的概念分别指一些什么?
    前端面试题汇总(待续)
    vue lottie vue-lottie : 使用教程
    webstorm 换行时 代码不对齐
    webstorm 导出编辑器配置.editorconfig
    vue 查看dist文件里的结构
    vue-cli 生产打包
    element form 校验数组每一项
    typescript无法识别vue中的$refs
    mac 10.14.5 [vue create的时候 mkdir没有权限]
  • 原文地址:https://www.cnblogs.com/whistle13326/p/7434790.html
Copyright © 2020-2023  润新知