#include <bits/stdc++.h>
using namespace std;
const double INF = 5e9+0.1;
const int mxN = 1e5+100;
vector<pair<int,int>> adj[mxN];
vector<int> ar;
double ans=INF;
struct DSU{
	vector<int> sz,par;
	void init(int n){
		sz.resize(n,1);
		par.resize(n);
		for(int i=1;i<n;++i) par[i]=i;
	}
	int findPar(int u){
		if(par[u]==u) return u;
		return par[u]=findPar(par[u]);
	}
	void unite(int u,int v){
		int upar=findPar(u);
		int vpar=findPar(v);
		if(upar==vpar) return;
		if(sz[upar]>sz[vpar]){
			par[vpar]=upar;
			sz[upar]+=sz[vpar];
		}else{
			par[upar]=vpar;
			sz[vpar]+=sz[upar];
		}
	}
};
double dfs(int u,int par,int h,double cost){
	if(u==h) return cost;
	if(ar[u]==2) cost/=2;
	else if(ar[u]==0) cost=0;
	double ans=INF;
	for(auto it:adj[u]){
		if(it.first^par){
			ans=min(ans,dfs(it.first,u,h,cost+it.second));
		}
	}
	return ans;
}
double solve(int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr){
	ar=arr;
	DSU ds; ds.init(N+5);
	for(int i=0;i<=N;++i) adj[i].clear();
	for(int i=0;i<M;++i){
		adj[x[i]].push_back({y[i],c[i]});
		adj[y[i]].push_back({x[i],c[i]});
		ds.unite(x[i],y[i]);
	} 
	if(ds.findPar(0)!=ds.findPar(H)) return -1;
	return dfs(0,-1,H,0);
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |