제출 #1157762

#제출 시각아이디문제언어결과실행 시간메모리
1157762lrnnz사이버랜드 (APIO23_cyberland)C++17
0 / 100
42 ms11848 KiB
#include <bits/stdc++.h> #include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std; #define all(a) (a).begin(), (a).end() #define sz(a) (int)(a).size() #define pb push_back #define ll long long #define ld long double #define ui uint64_t #define ar array #define us unordered_set #define cont(set, element) ((set).find(element) != (set).end()) /********* DEBUG *********/ template <typename T> void outvec(const vector<T>& Z, int hi = INT_MAX) { int count = 0; for (const T& x : Z) { if (count >= hi) break; cout << x << ' '; count++; } cout << "\n"; } // overloaded function for raw arrays template <typename T, size_t N> void outvec(const T (&arr)[N], int hi = INT_MAX) { int count = 0; for (size_t i = 0; i < N; ++i) { if (count >= hi) break; cout << arr[i] << ' '; count++; } cout << "\n"; } /********* DEBUG *********/ const ll inf = 1e18; const int MOD = 1e9+7; const int MOD2 = 998244353; const int mxN = 200005; // Subtask arr ∈ {0,1} // DSU, find all possible starting places // Push all starting nodes to Djikstra int parent[100005]; int _find(int x){ if (parent[x] != x) parent[x] = _find(parent[x]); return parent[x]; } void _uni(int x, int y){ x = _find(x); y = _find(y); parent[x] = y; } double solve(int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr) { for (int i = 0; i < N; i++){ parent[i] = i; } // node, cost vector<vector<pair<int,ld>>> adj(N); unordered_set<int> starts = {0}; for (int i = 0; i < M; i++){ adj[x[i]].pb({y[i], c[i]}); adj[y[i]].pb({x[i], c[i]}); if (x[i] != H && y[i] != H){ _uni(x[i], y[i]); } } // cost, node vector<bool> visited(N, false); priority_queue<pair<ld,int>, vector<pair<ld,int>>, greater<pair<ld,int>>> minheap; minheap.push({0, 0}); for (int i = 1; i < N; i++){ if (arr[i] == 0 && _find(i) == _find(0)){ minheap.push({0, i}); } } int cl = 0; while (minheap.size()){ pair<int,int> x = minheap.top(); minheap.pop(); ld cst = x.first; int nd = x.second; visited[nd] = true; if (nd == H){ return cst; } for (auto &z : adj[nd]){ if (visited[z.first]) continue; minheap.push({cst+z.second, z.first}); } } return -1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...