小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
11000k個殭屍據點,如果跑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條道路就可以到達的別的城市,就是危險城市。換句...