#include "cyberland.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
using ld = long double;
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) {
vector<vector<pair<ll,ll>>> adj(N+1);
for(int i = 0; i < M; i++){
ll a = x[i];
ll b = y[i];
ll w = c[i];
adj[a].push_back({b,w});
adj[b].push_back({a,w});
}
// first BFS: check which 0s we can actually reach
vector<bool> works(N+1,0);
vector<bool> vis(N+1,0);
vis[0] = 1;
queue<ll> q;
q.push(0);
while(!q.empty()){
ll at = q.front();
q.pop();
for(pair<ll,ll> p : adj[at]){
ll node = p.first;
if(vis[node]) continue;
if(node == H) continue;
vis[node] = 1;
works[node] = 1;
q.push(node);
}
}
vis.clear();
queue<pair<ll,ll>> qq;
ll mn = 1e18;
vis[H] = 1;
qq.push({H,0});
while(!qq.empty()){
pair<ll,ll> temp = qq.front();
qq.pop();
ll at = temp.first;
ll dist = temp.second;
for(pair<ll,ll> edge : adj[at]){
if(vis[edge.first]) continue;
vis[edge.first] = 1;
if((arr[edge.first] == 0 and works[edge.first]) or edge.first == 0){
mn = min(dist+edge.second, mn);
}
qq.push({edge.first, edge.second+dist});
}
}
return mn;
// 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... |