題目描述
小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
其實就是一道最短路的模板題,不過有幾個細節要注意。
1,不能用被殭屍占領的節點去更新其它節點。
2,1,n不算旅店費。
3,預處理危險節點時要用bfs,(dfs我t了最後兩個點)。
#include
using
namespace
std;
const
int maxn = 100005,maxm = 200005;
struct edgeedge[maxm*2];
int n,m,s,k,p,q;
int head[maxn],cnt,deep[maxn];
long
long dis[maxn];
bool win[maxn];
queue
qu;
struct cmp
};inline
void bfs()
}}inline
void add(int bg,int ed)
inline
void dijkstra()
}} int main()
for(register
int i=1;i<=m;i++)
bfs();dijkstra();
printf("%lld",dis[n]-p); //n點不掏錢
return
0;}
洛谷3393 逃離殭屍島
題目描述 小a住的國家被殭屍侵略了!小a打算逃離到該國唯一的國際空港逃出這個國家。該國有n個城市,城市之間有道路相連。一共有m條雙向道路。保證沒有自環和重邊。k個城市已經被殭屍控制了,如果貿然闖入就會被感染tat 所以不能進入。由其中任意城市經過不超過s條道路就可以到達的別的城市,就是危險城市。換句...
洛谷 P3393 逃離殭屍島
題目描述 小a住的國家被殭屍侵略了!小a打算逃離到該國唯一的國際空港逃出這個國家。該國有n個城市,城市之間有道路相連。一共有m條雙向道路。保證沒有自環和重邊。k個城市已經被殭屍控制了,如果貿然闖入就會被感染tat 所以不能進入。由其中任意城市經過不超過s條道路就可以到達的別的城市,就是危險城市。換句...
洛谷 P3393 逃離殭屍島
小a住的國家被殭屍侵略了!小a打算逃離到該國唯一的國際空港逃出這個國家。該國有n個城市,城市之間有道路相連。一共有m條雙向道路。保證沒有自環和重邊。k個城市已經被殭屍控制了,如果貿然闖入就會被感染tat.所以不能進入。由其中任意城市經過不超過s條道路就可以到達的別的城市,就是危險城市。換句話說只要某...