小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輸出樣例#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
對於20%資料,n<=50
對於100%資料,2 ≦ n ≦ 100000, 1 ≦ m ≦ 200000, 0 ≦ k ≦ n - 2, 0 ≦ s ≦ 100000
1 ≦ p < q ≦ 100000
solution:
本題最短路板子+小思維。
首先就是建立虛點$0$連向被控制的點,令邊長為$1$,廣搜一遍,求出各點到虛點的距離,然後判斷沒被控制的各點距離是否不大於$s+1$,就能處理出所有危險的點,標記一下。
然後就是跑一遍spfa,每次判斷連向的點是否被標記,然後選擇邊權差分約束。
但是這樣算會算上到了$n$點的花費,而題意到了$n$點就不需要花費了,於是最後輸出的答案還得減去多加的到$n$點的花費,
然後就ok了(注意答案會爆int)。
**:
#include#define il inline#define ll long long
#define for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
using
namespace
std;
const ll n=500005,inf=23333333333
;ll n,m,k,s,p,q;
ll h[n],net[n],dis[n],cnt,to[n];
bool
vis[n],ct[n],bj[n];
il ll gi()
il void add(int u,int v)
il void
pre()
}for(i,
1,n) if(dis[i]<=s&&!ct[i]) bj[i]=1;}
il void
spfa()
}else}}
}if(bj[n]==1)cout
else cout
}int
main()
洛谷 P3393 逃離殭屍島
題目描述 小a住的國家被殭屍侵略了!小a打算逃離到該國唯一的國際空港逃出這個國家。該國有n個城市,城市之間有道路相連。一共有m條雙向道路。保證沒有自環和重邊。k個城市已經被殭屍控制了,如果貿然闖入就會被感染tat 所以不能進入。由其中任意城市經過不超過s條道路就可以到達的別的城市,就是危險城市。換句...
洛谷 P3393 逃離殭屍島
小a住的國家被殭屍侵略了!小a打算逃離到該國唯一的國際空港逃出這個國家。該國有n個城市,城市之間有道路相連。一共有m條雙向道路。保證沒有自環和重邊。k個城市已經被殭屍控制了,如果貿然闖入就會被感染tat.所以不能進入。由其中任意城市經過不超過s條道路就可以到達的別的城市,就是危險城市。換句話說只要某...
洛谷P3393 逃離殭屍島
題目大意 有n個城市m條雙向道路,還有k個已經被殭屍占領的城市,規定 被占領城市不能經過,走不超過s條道路就能到達被占領城市的算危險城市,路費q,其他城市算安全城市,路費p。求從1走到n的最少花費 1和n路費為0 解題思路 我們先跑一遍bfs,求出哪些是危險城市,然後記錄每個城市的路費 貌似int會...