zoukankan      html  css  js  c++  java
  • luogu 3393 逃离僵尸岛

    题目描述

    小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家。

    该国有N个城市,城市之间有道路相连。一共有M条双向道路。保证没有自环和重边。

    K个城市已经被僵尸控制了,如果贸然闯入就会被感染TAT...所以不能进入。由其中任意城市经过不超过S条道路就可以到达的别的城市,就是危险城市。换句话说只要某个没有被占城市到某个被占城市不超过s距离,就是危险。

    小a住在1号城市,国际空港在N号城市,这两座城市没有被侵略。小a走每一段道路(从一个城市直接到达另外一个城市)得花一整个白天,所以晚上要住旅店。安全的的城市旅馆比较便宜要P元,而被危险的城市,旅馆要进行安保措施,所以会变贵,为Q元。所有危险的城市的住宿价格一样,安全的城市也是。在1号城市和N城市,不需要住店。

    小a比较抠门,所以他希望知道从1号城市到N号城市所需要的最小花费。

    输入数据保证存在路径,可以成功逃离。输入数据保证他可以逃离成功。

    输入输出格式

    输入格式:

    第一行4个整数(N,M,K,S)

    第二行2个整数(P,Q)

    接下来K行,ci,表示僵尸侵占的城市

    接下来M行,ai,bi,表示一条无向边

    输出格式:

    一个整数表示最低花费

    输入输出样例

    输入样例#1: 
    13 21 1 1
    1000 6000
    7
    1 2
    3 7
    2 4
    5 8
    8 9
    2 5
    3 4
    4 7
    9 10
    10 11
    5 9
    7 12
    3 6
    4 5
    1 3
    11 12
    6 7
    8 11
    6 13
    7 8
    12 13
    输出样例#1: 
    11000

    说明

    对于20%数据,N<=50

    对于100%数据,2 ≦ N ≦ 100000, 1 ≦ M ≦ 200000, 0 ≦ K ≦ N - 2, 0 ≦ S ≦ 100000

    1 ≦ P < Q ≦ 100000

    solution:

    首先看标签是最短路,再来看数据范围发现spfa可做,那么就开始做呗。

    这道题先介绍50分做法,一开始这道题我是这样想的,首先用bfs扩展危险城市,就是在每一个感染城市的节点开始扩展,每一个扩展的危险城市如果路线<=s,那么就开始标记,并把它放入队列。但是这样的时间复杂度会瞬间爆炸,如果每一个点都会询问道,则是qkn的,必然会T。

    那么该怎么做呢?

    学网络流都知道,可以建一个超级源点,也就是一个虚拟节点。我们不妨把这个思路放在spfa上。建一个虚拟节点0,将感染城市与虚拟节点相连,然后跑一边spfa,这样就会在kn的复杂度内扩展出所有的感染城市,然后再跑一边spfa,当然要做点特判,会在十分理想的复杂度内A掉这个题。

    还有一个坑点是,这道题要用LL。

     1 #include<bits/stdc++.h>
     2 #define LL long long
     3 #define _ 2000001
     4 using namespace std;
     5 struct edge
     6 {
     7     LL next,to,dist;
     8 } e[_];
     9 LL head[_],tot,n,m,k,S,dan[_],p,qq,vis[_],dis[_];
    10 LL mp1[_],mp2[_];
    11 inline void add(int x,int y)
    12 {
    13     e[++tot].next = head[x];
    14     e[tot].to = y;
    15     head[x] = tot;
    16 }
    17 void SPFA(int s)
    18 {
    19     queue<int>q;
    20     memset(dis,0x3f,sizeof(dis));
    21     memset(vis,0,sizeof(vis));
    22     q.push(s);
    23     vis[s]=1;
    24     dis[s]=0;
    25     while(!q.empty())
    26     {
    27         int u=q.front();
    28         q.pop();
    29         vis[u]=0;
    30         for(int i=head[u],v; v=e[i].to,i; i=e[i].next)
    31         {
    32             if(dis[v]>dis[u]+1)
    33             {
    34                 dis[v]=dis[u]+1;
    35                 if(!vis[v])
    36                     q.push(v),vis[v]=1;
    37             }
    38         }
    39     }
    40     for(int i=1;i<=n;i++)
    41         if(dan[i]!=2&&dis[i]<=S+1)
    42             dan[i]=1;
    43 }
    44 void spfa(int s)
    45 {
    46     queue<int>q;
    47     memset(dis,0x3f,sizeof(dis));
    48     memset(vis,0,sizeof(vis));
    49     q.push(s);
    50     vis[s]=1;
    51     dis[s]=0;
    52     while(!q.empty())
    53     {
    54         int u=q.front();
    55         q.pop();
    56         vis[u]=0;
    57         for(int i=head[u],v; v=e[i].to,i; i=e[i].next)
    58         {
    59             LL m=0;
    60             if(dan[v]==2) m=2147483647;
    61             if(dan[v]==1) m=qq;
    62             if(!dan[v]) m=p;
    63             if(v==n) m=0;
    64             if(dis[v]>dis[u]+m)
    65             {
    66                 dis[v]=dis[u]+m;
    67                 if(!vis[v])
    68                     vis[v]=1,q.push(v);
    69             }
    70         }
    71     }
    72 }
    73 int main()
    74 {
    75     cin >> n >> m >> k >> S;
    76     cin >> p >> qq;
    77     for(int i=1; i<=k; i++)
    78     {
    79         int a;
    80         cin >> a;
    81         dan[a]=2;
    82     }
    83     for(int i=1; i<=m; i++)
    84     {
    85         int a,b;
    86         cin>>a>>b;
    87         if(dan[a]==2)add(a,0),add(0,a);
    88         if(dan[b]==2)add(b,0),add(0,b);
    89         add(a,b),add(b,a);
    90     }
    91     SPFA(0);
    92     spfa(1);
    93     cout<<dis[n];
    94 }
  • 相关阅读:
    UVa532 Dungeon Master 三维迷宫
    6.4.2 走迷宫
    UVA 439 Knight Moves
    UVa784 Maze Exploration
    UVa657 The die is cast
    UVa572 Oil Deposits DFS求连通块
    UVa10562 Undraw the Trees
    UVa839 Not so Mobile
    327
    UVa699 The Falling Leaves
  • 原文地址:https://www.cnblogs.com/ifmyt/p/9272021.html
Copyright © 2011-2022 走看看