| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1309360 | azamurai | Cyberland (APIO23_cyberland) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#define int long long
#define ll long long
#define mp make_pair
#define fi first
#define se second
#define Sz(x) (int)x.size()
using namespace std;
const int N = 1e5 + 5;
const int K = 35;
const double INF = 1e18;
int n, m, k, s, a[N], comp[N], sz;
double dp[K][N];
vector <pair<int,double>> g[N];
void dfs(int v, int Comp) {
comp[v] = Comp;
for (auto to : g[v]) {
if (!comp[to.fi]) {
dfs(to.fi, Comp);
}
}
}
void solve() {
cin >> n >> m >> k >> s;
s++;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
while (m--) {
int u, v;
double w;
cin >> u >> v >> w;
u++; v++;
g[u].push_back(mp(v, w));
g[v].push_back(mp(u, w));
}
comp[s] = INT_MAX;
for (auto to : g[s]) {
if (!comp[to.fi]) {
dfs(to.fi, ++sz);
}
}
vector <int> have;
for (int i = 1; i <= n; i++) {
if (comp[i] == comp[1]) have.push_back(i);
}
for (int i = 0; i < K; i++) {
for (int j = 1; j <= n; j++) {
dp[i][j] = INF;
}
}
priority_queue <pair<double, pair<int,int>>> st;
st.push(mp(0, mp(s, 0)));
while (Sz(st) > 0) {
pair<double,pair<int,int>> p = st.top();
st.pop();
int v = p.se.fi, kk = p.se.se;
double t = -p.fi;
if (dp[kk][v] != t) continue;
for (auto [u, w] : g[v]) {
if (dp[kk][u] > (dp[kk][v] + w)) {
dp[kk][u] = dp[kk][v] + w;
st.push(mp(dp[kk][u], mp(u, kk)));
}
if (kk < k && dp[kk + 1][u] > ((dp[kk][v] + w) * 0.5)) {
dp[kk + 1][u] = (dp[kk][v] + w) * 0.5;
st.push(mp(dp[kk + 1][u], mp(u, kk + 1)));
}
}
}
cout << dp[k][s];
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
solve();
}
