Submission #02224


ソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long int64;
typedef pair< int64, int64 > Pi;
struct edge {
int to, cost;
};
const int64 INF = 1LL << 58;
int64 N, M, K, S, P, Q, Zonbi[1000000];
vector< edge > graph[1000000];
int A[1000000], B[1000000];
int Denger[1000000];
vector< int > normal[100000];
void BFS()
{
queue< int > Que;
vector< int64 > min_cost(N, INF);
for(int i = 0; i < N; i++) {
if(Zonbi[i]) {
Que.push(i);
min_cost[i] = 0;
}
}
while(!Que.empty()) {
int p = Que.front(); Que.pop();
for(int i = 0; i < normal[p].size(); i++) {
int v = normal[p][i];
if(min_cost[v] != INF) continue;
min_cost[v] = min_cost[p] + 1;
Que.push(v);
}
}
for(int i = 1; i < N - 1; i++) {
if(min_cost[i] <= S) {
Denger[i] = true;
}
}
}
int Dijkstra()
{
vector< int > min_cost(100000, INF);
priority_queue< Pi, vector< Pi >, greater< Pi > > que;
que.push(Pi(0, 0));
min_cost[0] = 0;
while(!que.empty()) {
int now = que.top().second;
int cost = que.top().first;
que.pop();
if(now == N - 1) return(cost);
if(cost > min_cost[now]) continue;
for(int i = 0; i < graph[now].size(); i++) {
edge e = graph[now][i];
if(Zonbi[e.to]) continue;
if(cost + e.cost < min_cost[e.to]) {
min_cost[e.to] = cost + e.cost;
que.push(Pi(min_cost[e.to], e.to));
}
}
}
return(-1);
}
signed main()
{
cin >> N >> M >> K >> S;
cin >> P >> Q;
for(int i = 0; i < K; i++) {
int C;
cin >> C;
--C;
Zonbi[C] = true;
}
for(int i = 0; i < M; i++) {
cin >> A[i] >> B[i];
--A[i], --B[i];
normal[A[i]].push_back(B[i]);
normal[B[i]].push_back(A[i]);
}
BFS();
for(int i = 0; i < M; i++) {
int cost = P;
if(Denger[B[i]]) cost = Q;
if(B[i] == 0 || B[i] == N - 1) cost = 0;
graph[A[i]].push_back((edge){B[i], cost});
cost = P;
if(Denger[A[i]]) cost = Q;
if(A[i] == 0 || A[i] == N - 1) cost = 0;
graph[B[i]].push_back((edge){A[i], cost});
}
cout << Dijkstra() << endl;
}

ステータス

項目 データ
問題 0261 - ゾンビ島 (Zombie Island)
ユーザー名 ei1333
投稿日時 2015-12-13 23:45:15
言語 C++11
状態 Accepted
得点 5
ソースコード長 2223 Byte
最大実行時間 200 ms
最大メモリ使用量 57344 KB

セット

セット 得点 Cases
1 INPUT1 1 / 1 *in1.txt
2 INPUT2 1 / 1 *in2.txt
3 INPUT3 1 / 1 *in3.txt
4 INPUT4 1 / 1 *in4.txt
5 INPUT5 1 / 1 *in5.txt

テストケース

ファイル名 状態 実行時間 メモリ使用量 #
2016-yo-t5-in1.txt AC 20 ms 36060 KB
1
2016-yo-t5-in2.txt AC 85 ms 48676 KB
2
2016-yo-t5-in3.txt AC 21 ms 36552 KB
3
2016-yo-t5-in4.txt AC 200 ms 57344 KB
4
2016-yo-t5-in5.txt AC 148 ms 53072 KB
5
2016-yo-t5-in_s1.txt AC 27 ms 36036 KB
2016-yo-t5-in_s2.txt AC 26 ms 35996 KB