Luogu P3393 逃離殭屍島

2021-08-31 06:46:37 字數 1775 閱讀 5763

小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

71 2

3 72 4

5 88 9

2 53 4

4 79 10

10 11

5 97 12

3 64 5

1 311 12

6 78 11

6 13

7 812 13

輸出樣例#1:複製

11000
k個殭屍據點,如果跑k次dijkstra必定超時

這個時候虛點站了出來,瞬間把k次降成了1次(就不能考慮一下將臣的感受qaq)

構造乙個0號節點,把它與k個殭屍據點連起來,跑一邊dijkstra就可以知道所有點到k個殭屍據點的最短距離

再跑一邊dijkstra

注意若變數開了longlong,堆,輸出也要longlong

#include#include#define ll long long

using namespace std;

int read()

const int n=1e6+4;

int n,m,k,s,p,h;

ll d[n],a[n];

bool fl[n];

int cnt,to[n],nxt[n],he[n],w[n];

struct a;

bool operator >(a i,a j)

priority_queue,greater>q;

inline void add(int u,int v,int k)

int main()

for(int i=1;i<=m;i++)

for(int i=0;i<=n;i++) d[i]=2e9;

q.push((a));

while(!q.empty())

); }

} for(int i=1;i<=n;i++)

q.push((a));

while(!q.empty())

); }

} printf("%lld\n",d[n]-a[n]);

return 0;

}

洛谷3393 逃離殭屍島

題目描述 小a住的國家被殭屍侵略了!小a打算逃離到該國唯一的國際空港逃出這個國家。該國有n個城市,城市之間有道路相連。一共有m條雙向道路。保證沒有自環和重邊。k個城市已經被殭屍控制了,如果貿然闖入就會被感染tat 所以不能進入。由其中任意城市經過不超過s條道路就可以到達的別的城市,就是危險城市。換句...

P3393 逃離殭屍島

小a住的國家被殭屍侵略了!小a打算逃離到該國唯一的國際空港逃出這個國家。該國有n個城市,城市之間有道路相連。一共有m條雙向道路。保證沒有自環和重邊。k個城市已經被殭屍控制了,如果貿然闖入就會被感染tat.所以不能進入。由其中任意城市經過不超過s條道路就可以到達的別的城市,就是危險城市。換句話說只要某...

洛谷3393 逃離殭屍島

題目描述 小a住的國家被殭屍侵略了!小a打算逃離到該國唯一的國際空港逃出這個國家。該國有n個城市,城市之間有道路相連。一共有m條雙向道路。保證沒有自環和重邊。k個城市已經被殭屍控制了,如果貿然闖入就會被感染tat 所以不能進入。由其中任意城市經過不超過s條道路就可以到達的別的城市,就是危險城市。換句...