제출 #783382

#제출 시각아이디문제언어결과실행 시간메모리
783382thimote75사이버랜드 (APIO23_cyberland)C++17
0 / 100
34 ms8396 KiB
#include "cyberland.h" #include <bits/stdc++.h> using namespace std; using bdata = vector<bool>; using ddata = vector<double>; using idata = vector<int>; using pii = pair<int, int>; using vpii = vector<pii>; using gpii = vector<vpii>; const double INF = 1e18; bdata reachable; gpii roads; idata type; void dfs_reach (int node) { if (reachable[node]) return ; reachable[node] = true; for (const auto &road : roads[node]) dfs_reach(road.first); } void dijkstra (ddata &distances, int H) { priority_queue<pair<double, int>> queue; for (int i = 0; i < distances.size(); i ++) if (distances[i] != INF) queue.push({ - distances[i], i }); while (queue.size() != 0) { const auto curr = queue.top(); queue.pop(); double dist = - curr.first; int node = curr.second; if (node == H) continue ; if (distances[node] != dist) continue ; for (const auto &road : roads[node]) { int next = road.first; int ndist = road.second + dist; if (ndist >= distances[next]) continue ; distances[next] = ndist; queue.push({ - ndist, next }); } } } void divide (int N, ddata &distances) { ddata new_distances(N); for (int i = 0; i < N; i ++) new_distances[i] = distances[i]; for (int i = 0; i < N; i ++) { if (!(type[i] == 2 && reachable[i])) continue ; for (const auto &road : roads[i]) { double h = (distances[i] / 2.0) + road.second; new_distances[road.first] = min( new_distances[road.first], h ); } } for (int i = 0; i < N; i ++) distances[i] = new_distances[i]; } ddata create (int N) { ddata res(N, INF); for (int i = 0; i < N; i ++) if (reachable[i] && type[i] == 0) res[i] = 0; return res; } 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) { type.clear(); type.resize(N); for (int i = 0; i < N; i ++) type[i] = arr[i]; type[0] = 0; roads.clear(); roads.resize(N); for (int i = 0; i < M; i ++) { roads[x[i]].push_back({ y[i], c[i] }); roads[y[i]].push_back({ x[i], c[i] }); } reachable.clear(); reachable.resize(N, false); dfs_reach(0); if (!reachable[H]) return -1; ddata values = create(N); dijkstra(values, H); //for (int i = 0; i < K; i ++) { // divide(N, values); // dijkstra(values, H); //} return values[H]; }

컴파일 시 표준 에러 (stderr) 메시지

cyberland.cpp: In function 'void dijkstra(ddata&, int)':
cyberland.cpp:30:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<double>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 |     for (int i = 0; i < distances.size(); i ++)
      |                     ~~^~~~~~~~~~~~~~~~~~
#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...