#include <bits/stdc++.h>
#include "cyberland.h"
using namespace std;
// #define int long long
#define sz(v) (int)(v).size()
#define all(v) (v).begin(), (v).end()
const int INF = (int)1e18 + 18;
struct EDGE {
int x, y, c;
};
int N, M, K, H;
vector <EDGE> edge;
vector <int> A;
namespace sub1 {
bool check_condition() {
return N <= 3 && K <= 30;
}
double solve() {
if (N == 1)
return 0.0;
else {
vector <vector <double>> cost(N, vector <double> (N, INF));
for (auto [u, v, c] : edge)
cost[u][v] = cost[v][u] = c;
if (N == 2)
return (cost[0][H] >= INF ? -1 : cost[0][H]);
else {
double ret = cost[0][H];
int other = 3 - H;
if (cost[0][other] >= INF && cost[other][H] >= INF)
return -1.0;
else {
if (A[other] == 0)
ret = min(ret, cost[other][H]);
else if (A[other] == 1)
ret = min(ret, cost[0][other] + cost[other][H]);
else {
if (K >= 1)
ret = min(ret, cost[0][other] / 2.0 + cost[other][H]);
else
ret = min(ret, cost[0][other] + cost[other][H]);
}
}
return ret;
}
}
}
}
double solve(int n, int m, int k, int h, vector <int> X, vector <int> Y, vector <int> C, vector <int> arr) {
N = n, M = m, K = k, H = h;
A = arr;
for (int i = 0; i < M; ++i)
edge.push_back({ X[i], Y[i], C[i] });
if (sub1 :: check_condition())
sub1 :: solve();
return -1;
}
# | 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... |