其中 K 个城市已经被僵尸控制了,如果贸然闯入就会被感染 TAT…所以不能进入。由其中任意城市经过不超过 S 条道路就可以到达的别的城市,就是危险城市。换句话说只要某个城市到任意被僵尸控制的城市距离不超过 S,就是危险的。
小 a 住在 1 号城市,国际空港在 N 号城市,这两座城市没有被侵略。小a走每一段道路(从一个城市直接到达另外一个城市)得花一整个白天,所以晚上要住旅店。安全的的城市旅馆比较便宜要 P 元,而被危险的城市,旅馆要进行安保措施,所以会变贵,为 Q 元。所有危险的城市的住宿价格一样,安全的城市也是。在 1 号城市和 N 城市,不需要住店。
小 a 比较抠门,所以他希望知道从 1 号城市到 N 号城市所需要的最小花费。
输入数据保证存在路径,可以成功逃离。输入数据保证他可以逃离成功。
输入格式
第一行 4 个整数 N,M,K,S。
第二行两个整数 P,Q。
接下来 K 行,每行一个整数 ci,表示僵尸侵占的城市编号。
接下来 M 行,ai,bi,表示一条无向边。
输出格式
一个整数表示最低花费。
思路:bfs,最短路
使用邻接表建图,此处略。
注意无向图的二倍空间。
僵尸的处理
首先使用 zombie[i] 数组记录第 i 个点是否被僵尸占领。
对于被僵尸占领的点,不能经过它,并且对它 S 格以内的点标记上危险,使用 exps[x] 表示第 x 个点是否危险(价格贵)。
此处使用广度优先,使用深度优先可能会出错或时间复杂度较高。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
voidmark(int x){ auto q = queue<pair<int, int>>(); q.push({x, 0}); vis[x] = true; while(q.size()) { auto n = q.front(); q.pop(); exps[n.first] = true; if(n.second < S) { for(int i = head[n.first]; i; i = edge[i].next) { int to = edge[i].to; if(vis[to]) continue; vis[to] = true; q.push({to, n.second + 1}); } } } }