RT.
Code:
#include<queue>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iostream>
#include<cmath>
#define ll long long
#define pi 3.1415926535897
#define mi3(a,b,c) min(a,min(b,c))
#define ma3(a,b,c) max(a,max(b,c))
#define F(a,b,c) for(int a=b;a<=c;a++)
#define f(a,b,c) for(int a=b;a>=c;a--)
#define WH(a) while(a)
#define CO continue
#define BR break
#define pb emplace_back
#define INF 0x3f3f3f3f
#define pii pair<int, int>
using namespace std;
template<typename T> inline void read(T& x)
{
x = 0;
int f = 1;
char ch = getchar();
for (;ch < '0' || ch > '9';ch = getchar()) if(ch == '-') f = 0;
for (; ch >= '0' && ch <= '9';ch = getchar()) x = x*10+ch-48;
if (!f) x = -x;
}
template<typename T> inline T read()
{
T x = 0;
int f = 1;
char ch = getchar();
for (;ch < '0' || ch > '9';ch = getchar()) if(ch == '-') f = 0;
for (; ch >= '0' && ch <= '9';ch = getchar()) x = x*10+ch-48;
if (!f) x = -x;
return x;
}
struct edge{
int v, w;
};
struct stat11111111{
int u, l;
};
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);
#ifndef ONLINE_JUDGE
int main() {
int T;
assert(1 == scanf("%d", &T));
while (T--){
int N,M,K,H;
assert(4 == scanf("%d %d %d\n%d", &N, &M, &K, &H));
std::vector<int> x(M);
std::vector<int> y(M);
std::vector<int> c(M);
std::vector<int> arr(N);
for (int i=0;i<N;i++)
assert(1 == scanf("%d", &arr[i]));
for (int i=0;i<M;i++)
assert(3 == scanf("%d %d %d", &x[i], &y[i], &c[i]));
printf("%.12lf\n", solve(N, M, K, H, x, y, c, arr));
}
}
#endif
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){
double dis[100009][109];
vector<edge> g[100009];
F(i,0,m-1){
g[x[i]].pb((edge){y[i], c[i]});
g[y[i]].pb((edge){x[i], c[i]});
}
F(i,0,n-1){
F(j,0,k){
dis[i][j]=INF;
}
}
queue<stat11111111> q;
q.push((stat11111111){0, 0});
dis[0][0] = 0;
while(!q.empty()){
int u = q.front().u;
int l = q.front().l;
q.pop();
if(u == h) continue;
if(arr[u] == 0) dis[u][l] = 0;
for(auto et : g[u]){
if(dis[et.v][l] > dis[u][l] + et.w){
dis[et.v][l] = dis[u][l] + et.w;
q.push({et.v, l});
}
if(arr[et.v] == 2 && l<k && dis[et.v][l+1] > (dis[u][l] + et.w)/2.0){
dis[et.v][l+1] = (dis[u][l] + et.w)/2.0;
q.push({et.v, l+1});
}
}
}
double res = INF;
F(i,0,k){
res = min(res, dis[h][i]);
}
if(res - INF > 1e-12) return -1;
return res;
}
Record:
