Submission #64292

#TimeUsernameProblemLanguageResultExecution timeMemory
64292keko37Commuter Pass (JOI18_commuter_pass)C++14
100 / 100
1769 ms155808 KiB
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<set> using namespace std; typedef long long llint; const int MAXN = 100005; const int MAXM = 200005; const llint INF = 1000000000000000000LL; llint n, m, s, t, uu, vv, sol = INF; llint a[MAXM], b[MAXM], c[MAXM], dist[3*MAXN], bio[MAXN], ok[MAXM]; vector < pair <int, int> > v[MAXN], r[MAXN], p[MAXN]; set < pair <llint, llint> > st; void obrni () { for (int i=1; i<=n; i++) { p[i].clear(); } for (int i=1; i<=n; i++) { for (int j=0; j<r[i].size(); j++) { p[r[i] [j].first].push_back(make_pair(i, 0)); } } for (int i=1; i<=n; i++) { r[i] = p[i]; } } bool dfs (int x) { if (x == s) return 1; if (bio[x] != -1) return bio[x]; bio[x] = 0; for (int i=0; i<r[x].size(); i++) { int sus = r[x] [i].first; int ind = r[x] [i].second; ok[ind] = dfs(sus); bio[x] |= ok[ind]; } return bio[x]; } void filter () { memset(bio, -1, sizeof bio); dfs(t); for (int i=1; i<=n; i++) { for (int j=0; j<r[i].size(); j++) { if (ok[r[i] [j].second]) p[i].push_back(r[i] [j]); } } for (int i=1; i<=n; i++) { r[i] = p[i]; } } void dijkstra1 () { for (int i=1; i<=n; i++) { dist[i] = (i == s) ? 0LL : INF; } st.insert(make_pair(0, s)); while (!st.empty()) { int cvor = st.begin() -> second; st.erase(st.begin()); for (int i=0; i<v[cvor].size(); i++) { int sus = v[cvor] [i].first; int ind = v[cvor] [i].second; if (dist[cvor] + c[ind] < dist[sus]) { if (dist[sus] != INF) st.erase(make_pair(dist[sus], sus)); dist[sus] = dist[cvor] + c[ind]; st.insert(make_pair(dist[sus], sus)); r[sus].clear(); } if (dist[cvor] + c[ind] == dist[sus]) r[sus].push_back(make_pair(cvor, ind)); } } } void dijkstra2 () { for (int i=1; i<=n; i++) { for (int j=0; j<3; j++) { int cvor = i + j*MAXN; if (cvor == uu) dist[cvor] = 0; else dist[cvor] = INF; } } st.insert(make_pair(0, uu)); while (!st.empty()) { int all = (st.begin() -> second); int tip = all / MAXN; int cvor = all % MAXN; st.erase(st.begin()); for (int i=0; i<v[cvor].size(); i++) { int sus = v[cvor] [i].first; int ind = v[cvor] [i].second; if (tip == 1 || tip == 2) sus += 2*MAXN; if (dist[all] + c[ind] < dist[sus]) { if (dist[sus] != INF) st.erase(make_pair(dist[sus], sus)); dist[sus] = dist[all] + c[ind]; st.insert(make_pair(dist[sus], sus)); } } if (tip == 2) continue; for (int i=0; i<r[cvor].size(); i++) { int sus = r[cvor] [i].first + MAXN; if (dist[all] < dist[sus]) { if (dist[sus] != INF) st.erase(make_pair(dist[sus], sus)); dist[sus] = dist[all]; st.insert(make_pair(dist[sus], sus)); } } } sol = min(sol, dist[vv]); sol = min(sol, dist[vv + MAXN]); sol = min(sol, dist[vv + MAXN*2]); } int main () { cin >> n >> m >> s >> t >> uu >> vv; for (int i=0; i<m; i++) { scanf("%lld%lld%lld", &a[i], &b[i], &c[i]); v[a[i]].push_back(make_pair(b[i], i)); v[b[i]].push_back(make_pair(a[i], i)); } dijkstra1(); filter(); dijkstra2(); obrni(); dijkstra2(); cout << sol; return 0; }

Compilation message (stderr)

commuter_pass.cpp: In function 'void obrni()':
commuter_pass.cpp:25:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j=0; j<r[i].size(); j++) {
                 ~^~~~~~~~~~~~
commuter_pass.cpp: In function 'bool dfs(int)':
commuter_pass.cpp:38:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i=0; i<r[x].size(); i++) {
                ~^~~~~~~~~~~~
commuter_pass.cpp: In function 'void filter()':
commuter_pass.cpp:51:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j=0; j<r[i].size(); j++) {
                 ~^~~~~~~~~~~~
commuter_pass.cpp: In function 'void dijkstra1()':
commuter_pass.cpp:68:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i=0; i<v[cvor].size(); i++) {
                 ~^~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'void dijkstra2()':
commuter_pass.cpp:95:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i=0; i<v[cvor].size(); i++) {
                 ~^~~~~~~~~~~~~~~
commuter_pass.cpp:106:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i=0; i<r[cvor].size(); i++) {
                 ~^~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:123:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld%lld%lld", &a[i], &b[i], &c[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...