# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1204395 | Mighilon | Cyberland (APIO23_cyberland) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
#ifdef DEBUG
#include "../Library/debug.h"
#else
#define dbg(x...)
#endif
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef vector<int> vi;
typedef vector<bool> vb;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define F0R(i, a) for (int i = 0; i < (a); ++i)
#define FORd(i, a, b) for (int i = (b) - 1; i >= (a); --i)
#define F0Rd(i, a) for (int i = (a) - 1; i >= 0; --i)
#define trav(a, x) for (auto& a : x)
#define f first
#define s second
#define pb push_back
#define sz(x) (int)(x).size()
#define all(x) x.begin(), x.end()
const char nl = '\n';
const int INF = 1e9;
const int MOD = 1e9 + 7;
struct DSU {
vector<int> par, sz;
int c; // connected components
DSU(int n) : par(n), c(n) {
sz.resize(n, 1);
for (int i = 0; i < n; ++i) par[i] = i;
}
int find(int i) {
return par[i] == i ? i : (par[i] = find(par[i]));
}
bool same(int i, int j) {
return find(i) == find(j);
}
int get_size(int i) {
return sz[find(i)];
}
int count() {
return c;
}
int merge(int i, int j) {
if ((i = find(i)) == (j = find(j))) return -1;
else --c;
if (sz[i] > sz[j]) swap(i, j);
par[i] = j;
sz[j] += sz[i];
return j;
}
};
double solve(int n,int m,int k,int h,vi x,vi y,vi c,vi arr){
vector<vpi> adj(n);
k=min(k,70);
DSU dsu(n);
F0R(i,m){
if(x[i]!=h&&y[i]!=h)
dsu.merge(x[i],y[i]);
adj[x[i]].pb({y[i],c[i]});
adj[y[i]].pb({x[i],c[i]});
}
using T = tuple<double,int,int>;
priority_queue<T,vector<T>,greater<T>>pq;
vector<vector<double>> dist(k+1,vector<double>(n, 1e18));
auto f=[&](double d, int _k, int v){
if(d < dist[_k][v]){
dbg(d,_k,v)
dist[_k][v]=d;
pq.push({d,_k,v});
}
};
vector<double> p(k+1,1);
FOR(i,1,k+1) p[i]=p[i-1]/2;
arr[0]=0;
f(0,k,h);
while(!pq.empty()){
auto [w,_k,v]=pq.top();
dbg(w,_k,v);
pq.pop();
if(dist[_k][v] < w)
continue;
if(arr[v]==0){
return w;
}
for(auto [u,_w]:adj[v]){
if(!dsu.same(0,u))
continue;
f(w+_w*p[k-_k],_k,u);
if(arr[v]==2&&_k>0)
f(w+_w*p[k-_k+1],_k-1,u);
}
}
return -1;
}
#define DEBUG
#ifdef DEBUG
int32_t main(){
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int TC = 1;
cin >> TC;
while(TC--){
int n,m,k,h;
cin>>n>>m>>k>>h;
vi x(m),y(m),c(m),arr(n);
// F0R(i,m)cin>>x[i];
// F0R(i,m)cin>>y[i];
// F0R(i,m)cin>>c[i];
F0R(i,n)cin>>arr[i];
F0R(i,m)cin>>x[i]>>y[i]>>c[i];
cout<<fixed<<setprecision(12)<<solve(n,m,k,h,x,y,c,arr)<<nl;
}
return 0;
}
#endif