系统警告,Bronya请求支援(两遍最短路)

系统警告,Bronya请求支援

Description

142aa380b5941737a40824453508e5d9.jpg


休伯利安号的一行人来到了由逆熵镇守的前文明遗迹[海渊城],他们准备用巨大的传送装置[海渊之眼]进入量子之海,寻找丢失的渴望宝石。然而在行动前夜爱因斯坦却遭到神秘人的袭击,下落不明,而海渊之眼也发生了原因不明的暴走。为了找回渴望宝石,布洛妮娅在一片混乱中,只身一人跳入了量子之海。布洛妮娅在经受认知回廊的考验之后,得到了逆熵盟主瓦尔特的帮助,并拿到了理之律者核心,然而就在这时,布洛妮娅接收到强烈的崩坏能警报,数据显示渴望宝石受到理之律者核心的激发变得极不稳定,会在x秒后爆发出强烈的崩坏能脉冲,布洛妮娅已经没有时间了,必须马上出发,“ 重装小兔19C,ride on!”。

量子之海由n个地点组成,编号1−n1 - n1n,这些地点由mmm条双向道路连接,保证任意两个地点连通,在t=0t=0t=0时刻布洛妮娅在111号地点,渴望宝石在量子之海的最深处nnn号地点。布洛妮娅从一个地点沿着一条道路到达另一个地点需要111秒时间(当然布洛妮娅可以选择不移动),渴望宝石会在t=xt=xt=x时刻爆发,爆发只会持续一瞬间,但布洛妮娅无法承受如此强烈的崩坏能爆发,幸运的是在量子之海中有kkk个地点是安全的,能够躲避崩坏能的侵蚀,也就是说t=xt=xt=x时刻布洛妮娅必须待在其中一个安全地点里,等待爆发过后才能继续前往nnn号地点取回渴望宝石。(如果布洛妮娅能够在t≤xt \leq xtx时取回渴望宝石,就不会爆发)布洛妮娅必须尽快完成任务,但是她的生物芯片被烧毁了,无法计算出最少需要花费多少时间,因此她向舰长您请求帮助,请告诉布洛妮娅她最少需要花费多少时间才能取回渴望宝石。

Input

第一行三个整数n,m,xn,m,xn,m,x表示地点的数量,道路的数量,爆发的时间

接下来mmm行,每行两个整数a,ba,ba,b,表示aaabbb之间有一条双向道路连接。

接下来一行一个整数kkk,表示安全地点的数量

接着kkk行,每行一个整数kik_iki,表示kik_iki是安全地点

2≤n≤1e5, n−1≤m≤1e5,0≤x≤100,0≤k≤100,1≤ki ≤n2 \leq n \leq 1e5,  n-1 \leq m \leq1e5, 0 \leq x \leq 100,0 \leq k \leq 100,1 \leq k_i  \leq n2n1e5, n1m1e5,0x1000k1001ki n;

Output

如果布洛妮娅能够取回渴望宝石,输出最少需要花费多少时间,否则输出" -1 "。

//真的很想在output里面加中文,但好像判题机不允许   (´-ωก`)。

Sample Input 1

4 4 0
1 2
1 3
2 4
3 4
1
2

Sample Output 1

-1

Sample Input 2

4 4 1
1 2
1 3
2 4
3 4
1
2

Sample Output 2

2

Sample Input 3

4 4 5
1 2
1 3
2 4
3 4
1
2

Sample Output 3

2

Hint

对于第一个样例,布洛妮娅无法在爆发前到达安全地点,因此任务失败。

对于第二个样例,布洛妮娅在t=1t=1t=1时必须待在222号地点躲避崩坏能爆发。

对于第三个样例,布洛妮娅可以在x秒内取回渴望宝石,因此崩坏能不会爆发,答案是222s。

Source

休伯利安号退伍舰长Chter 指挥官编号:19470572

思路

分别以起点s、终点e 跑一遍最短路,首先看能否在规定时间内从s 到 e点,如果能到话直接输出时间,否则要现到躲避处,躲避t 秒,之后在从躲避点到达e点(这个路程所话多时间正用上了我们 终点e起点逆向跑最短路的这个过程)

代码

#include<iostream>
#include<queue>
#include<cstdio>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;

const int Len = 1e6;
const int INF = 1e9 + 10;
struct Edge
{
    int v, w, next;
} edge[Len];
int head[2*Len];
int k = 0;
int n,m,t;
int pos[Len];

void Add(int u, int v, int w)
{
    edge[++ k] = (Edge){ v, w, head[u]};
    head[u] = k;
}

void init()
{
    k = 0;
}

int dis1[Len], dis2[Len];

void Spfa(int s, int dis[])
{
    int use[Len] = {0};
    for(int i = 1; i <= n; i ++) 
        dis[i] = INF;
    dis[s] = 0;
    queue<int> q;
    q.push(s);
    int u,v;
    while(! q.empty())
    {
        u = q.front(); q.pop();
        use[u] = 0;

        for(int i = head[u]; i != 0; i = edge[i].next)
        {
            v = edge[i].v;
            if(dis[v] > dis[u] + 1)
            {
                dis[v] = dis[u] + 1;
                if(! use[v])
                {
                    q.push(v);
                    use[v] = 1;
                }
            }
        }
    }
}


int main()
{
//    freopen("A.txt","r",stdin);
    scanf("%d %d %d", &n, &m, &t);
    int u,v;
    for(int i = 1; i <= m; i ++)
    {
        scanf("%d %d", &u, &v);
        Add(u,v,1);
        Add(v,u,1);
    }
    int cnt;
    scanf("%d", &cnt);
    for(int i = 1; i <= cnt; i ++)
        scanf("%d", &pos[i]);

    Spfa(1, dis1);
    Spfa(n, dis2);
    if(dis1[n] <= t)
    {
        printf("%d\n", dis1[n]);
    }
    else
    {
        int mn = INF;
        for(int i = 1; i <= cnt; i ++)
            if(dis1[pos[i]] <= t)
                mn = min(mn, t + dis2[pos[i]]);
        printf("%d\n", mn == INF ? -1 : mn);
    }

    return 0;
}


发布了149 篇原创文章 · 获赞 228 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_34261446/article/details/105152951
今日推荐