제출 #886751

#제출 시각아이디문제언어결과실행 시간메모리
886751StefanL2005Commuter Pass (JOI18_commuter_pass)C++14
100 / 100
615 ms33828 KiB
#include <bits/stdc++.h> using namespace std; ifstream in("file.in"); #define make_arc(N, a, b); N.node = a; N.dist = b; #define ll long long const ll inf = 1LL * 1000 * 1000 * 1000 * 1000 * 1000 * 1000; ll best = 0; struct arc{ int node; ll dist; arc(){ node = 0; dist = 0; } }; bool rule(arc A, arc B) { if (A.dist == B.dist) return A.node < B.node; return A.dist < B.dist; } void Dijkstra(int start, vector<vector<int>> &Vec, vector<vector<int>> &Cost, vector<ll> &D) { D.assign(Cost.size(), inf); D[start] = 0; arc A; make_arc(A, start, 0); set<arc, bool(*)(arc, arc)> Set(rule); Set.insert(A); while (!Set.empty()) { auto X = *Set.begin(); Set.erase(X); for (int i = 0; i < Vec[X.node].size(); i++) { int vecin = Vec[X.node][i]; if (D[X.node] + Cost[X.node][i] < D[vecin]) { D[vecin] = D[X.node] + Cost[X.node][i]; make_arc(A, vecin, 0); auto index = Set.lower_bound(A); if (index != Set.end() && index->node == vecin) Set.erase(index); make_arc(A, vecin, D[vecin]); Set.insert(A); } } } } struct base{ ll f, s, sum; base() { f = s = sum = inf; } }; vector<bool> Been; void TryRoutes(int node, int end, vector<vector<int>> &Vec, vector<vector<int>> &Cost, vector<vector<ll>> &Dist, vector<base> &Bsum) { Been[node] = true; Bsum[node].f = Dist[2][node]; Bsum[node].s = Dist[3][node]; Bsum[node].sum = Bsum[node].f + Bsum[node].s; ll Min1 = Bsum[node].f, Min2 = Bsum[node].s; if (node == end) return; for (int i = 0; i < Vec[node].size(); i++) { int vecin = Vec[node][i]; if (Dist[0][node] + Cost[node][i] + Dist[1][vecin] != Dist[0][end]) continue; if (Been[vecin] == false) TryRoutes(vecin, end, Vec, Cost, Dist, Bsum); Bsum[node].sum = min(Bsum[node].sum, Bsum[vecin].sum); Min1 = min(Min1, Bsum[vecin].f); Min2 = min(Min2, Bsum[vecin].s); } Bsum[node].sum = min(Bsum[node].sum, Bsum[node].f + Min2); Bsum[node].sum = min(Bsum[node].sum, Bsum[node].s + Min1); Bsum[node].f = min(Bsum[node].f, Min1); Bsum[node].s = min(Bsum[node].s, Min2); } int main() { int n, m, S, T, U, V; cin>> n >> m; cin>> S >> T; cin>> U >> V; S--; T--; U--; V--; vector<vector<int>> Vec(n), Cost(n); for (int i = 0; i < m; i++) { int a, b, c; cin>> a >> b >> c; a--; b--; Vec[a].push_back(b); Vec[b].push_back(a); Cost[a].push_back(c); Cost[b].push_back(c); } vector<vector<ll>> Dist(4, vector<ll> (n)); Dijkstra(S, Vec, Cost, Dist[0]); Dijkstra(T, Vec, Cost, Dist[1]); Dijkstra(U, Vec, Cost, Dist[2]); Dijkstra(V, Vec, Cost, Dist[3]); //pentru usurinta S-0 T-1 U-2 V-3 best = Dist[2][V]; vector<base> Bsum(n); Been.assign(n, false); TryRoutes(S, T, Vec, Cost, Dist, Bsum); best = min(best, Bsum[S].sum); cout<< best; return 0; }

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

commuter_pass.cpp: In function 'void Dijkstra(int, std::vector<std::vector<int> >&, std::vector<std::vector<int> >&, std::vector<long long int>&)':
commuter_pass.cpp:40:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |         for (int i = 0; i < Vec[X.node].size(); i++)
      |                         ~~^~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'void TryRoutes(int, int, std::vector<std::vector<int> >&, std::vector<std::vector<int> >&, std::vector<std::vector<long long int> >&, std::vector<base>&)':
commuter_pass.cpp:80:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |     for (int i = 0; i < Vec[node].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...