#include<bits/stdc++.h>
#include<cmath>
#define ll long long
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rof(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back
using namespace std;
const ll inf=1e15,P=100010,Q=77;
struct ccf{
ll v,w;
};
vector<ccf >e[P];
int a[P];
int vis[P][Q];
double ans,d[P][Q];
int n,m,k,h;
struct node{
ll u,t;
};
queue<node >q;
void spfa(){
For(i,1,n){
For(j,0,k){
vis[i][j]=0;
d[i][j]=inf;
}
}
For(i,0,k) vis[h][i]=1;
while(!q.empty()) q.pop();
d[1][0]=0;
vis[1][0]=1;
q.push({1,0});
while(!q.empty()){
int u=q.front().u,t=q.front().t;
q.pop();
vis[u][t]=0;
if(a[u]==0) d[u][t]=0;
for(auto &p:e[u]){
ll v=p.v,w=p.w;
if(t<k && a[v]==2 && (d[u][t]+(double)w)/2.0<d[v][t+1]){
d[v][t+1]=(d[u][t]+(double)w)/2.0;
if(!vis[v][t+1]){
q.push({v,t+1});
vis[v][t+1]=1;
}
}
if(d[u][t]+(double)w<d[v][t]){
d[v][t]=d[u][t]+(double)w;
if(!vis[v][t]){
q.push({v,t});
vis[u][t]=1;
}
}
}
}
}
double solve(int N, int M, int K, int H, std::vector<int> x, std::vector<int> y, std::vector<int> c, std::vector<int> arr){
n=N,m=M,k=min(K,70),h=H+1;
For(i,1,n) e[i].clear();
For(i,0,m-1){
e[x[i]+1].pb({y[i]+1,c[i]});
e[y[i]+1].pb({x[i]+1,c[i]});
}
ans=inf;
For(i,1,n) a[i]=arr[i-1];
spfa();
For(i,0,k) ans=min(ans,d[h][i]);
if(ans==inf) return -1;
return ans;
}
rt,只过了sub1,2,后面全RE了