-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathProblemF.cpp
More file actions
73 lines (65 loc) · 1.76 KB
/
ProblemF.cpp
File metadata and controls
73 lines (65 loc) · 1.76 KB
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
#include <cstdio>
#include <queue>
#include <vector>
using std::vector;
using std::priority_queue;
const int MAXN = 5e5 + 5;
struct edge{
int v, w;
};
int n, m, p, k;
bool vis[MAXN][12];
long long dist[MAXN][12];
vector<edge> g[MAXN];
vector<int> portal[MAXN];
struct node{
int u, level;
bool operator < (const node& rhs) const {
return dist[u][level] > dist[rhs.u][rhs.level];
}
};
int main() {
scanf("%d%d%d%d", &n, &m, &p, &k);
for(int i = 1; i <= n; i++) {
for(int j = 0; j <= k; j++) {
dist[i][j] = 1e18;
}
}
for(int i = 0; i < m; i++) {
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
g[u].push_back((edge){v,c});
}
for(int i = 0; i < p; i++) {
int u, v;
scanf("%d%d", &u, &v);
portal[u].push_back(v);
}
int s, t; scanf("%d%d", &s, &t);
priority_queue<node> q;
q.push((node){s, 0});
dist[s][0] = 0;
while(!q.empty()) {
node cur = q.top(); q.pop();
if(vis[cur.u][cur.level]) continue;
vis[cur.u][cur.level] = true;
for(edge &e : g[cur.u]) {
if(dist[e.v][cur.level] > dist[cur.u][cur.level] + e.w) {
dist[e.v][cur.level] = dist[cur.u][cur.level] + e.w;
if(!vis[e.v][cur.level]) q.push((node){e.v, cur.level});
}
}
for(int &v : portal[cur.u]) {
if(dist[v][cur.level + 1] > dist[cur.u][cur.level] && cur.level < k) {
dist[v][cur.level + 1] = dist[cur.u][cur.level];
if(!vis[v][cur.level + 1]) q.push((node){v, cur.level + 1});
}
}
}
long long ans = 1e18;
for(int i = 0; i <= k; i++) {
ans = std::min(ans, dist[t][i]);
}
printf("%lld\n", ans);
return 0;
}