• 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 }
  • 相关阅读:
    C#正则表达式(2):常用的特殊字符(元字符,限定字符)
    asp.net中路径
    C#正则表达式常用元字符
    iTextSharp插入图像
    iTextSharp中中文显示实例
    asp.net中MD5
    sql语句操作数据库之新增
    asp.net使用uploadify上传文件不能超过4mb的解决方案
    在浏览器地址栏中执行js代码
    MSSQL系统常用全局变量
  • 原文地址:https://www.cnblogs.com/ifmyt/p/9272021.html
Copyright © 2020-2023  润新知