Submission #857640

#TimeUsernameProblemLanguageResultExecution timeMemory
857640yusufhocaogluCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
412 ms42444 KiB
#include <iostream> #include <bits/stdc++.h> using namespace std; #define MOD 1000000007 #define MOD2 998244353 #define ll long long #define pri pair<int,int> #define prl pair<ll,ll> #define vi vector<int> #define vl vector<ll> #define vp vector<pair<int,int>> #define vpl vector<pair<ll,ll>> #define re return 0 #define sqrt sqrtl #define int ll struct node { vector<pri> adj; int val; pri sx = {1e18,1e18},sy = {1e18,1e18}; }; pri compx(pri a, pri b) { if (a.first < b.first) return a; if (a.first==b.first) return a.second > b.second ? b : a; return b; } pri compy(pri a,pri b) { if (a.second < b.second) return a; if (a.second == b.second) return a.first < b.first ? a : b; return b; } int32_t main() { int n,m;cin>>n>>m; int s,t,u,v;cin>>s>>t>>u>>v; vector<node> nodes(n); for (int i = 0;i<m;i++) { int a,b,c;cin>>a>>b>>c; nodes[a-1].adj.push_back({b-1,c}); nodes[b-1].adj.push_back({a-1,c}); } /* for (int i = 0;i<n;i++) { cout<<i<<endl; for (int j = 0;j<nodes[i].adj.size();j++) { cout<<nodes[i].adj[j].first<<" "<<nodes[i].adj[j].second<<endl; } } */ auto dijkstra = [n,nodes](int start) { vector<int> mp(n,1e18); mp[start] = 0; set<pri> q; q.insert({0,start}); while (q.size()) { auto f = *q.begin(); for (int i = 0;i<nodes[f.second].adj.size();i++) { if (mp[nodes[f.second].adj[i].first] > (mp[f.second] + nodes[f.second].adj[i].second)) { mp[nodes[f.second].adj[i].first] = mp[f.second] + nodes[f.second].adj[i].second; q.insert({mp[f.second] + nodes[f.second].adj[i].second,nodes[f.second].adj[i].first}); } } q.erase(q.begin()); } return mp; }; vector<int> dijkS,dijkU,dijkV; dijkS = dijkstra(s-1); dijkU = dijkstra(u-1); dijkV = dijkstra(v-1); vector<pri> dijk(n); for (int i = 0;i<n;i++) { dijk[i] = {dijkS[i],i}; } sort(dijk.begin(),dijk.end()); nodes[s-1].sx = nodes[s-1].sy = {dijkU[s-1],dijkV[s-1]}; for (int i = 0;i<dijk.size();i++) { for (int j = 0;j<nodes[dijk[i].second].adj.size();j++) { if (dijkS[nodes[dijk[i].second].adj[j].first] + nodes[dijk[i].second].adj[j].second == dijk[i].first) { nodes[dijk[i].second].sx = compx(nodes[dijk[i].second].sx,nodes[nodes[dijk[i].second].adj[j].first].sx); nodes[dijk[i].second].sy = compy(nodes[dijk[i].second].sy,nodes[nodes[dijk[i].second].adj[j].first].sy); //cout<<nodes[dijk[i].second].minY<<endl; } } nodes[dijk[i].second].sx.first = min(nodes[dijk[i].second].sx.first,dijkU[dijk[i].second]); nodes[dijk[i].second].sy.first = min(nodes[dijk[i].second].sy.first,dijkU[dijk[i].second]); nodes[dijk[i].second].sx.second = min(nodes[dijk[i].second].sx.second,dijkV[dijk[i].second]); nodes[dijk[i].second].sy.second = min(nodes[dijk[i].second].sy.second,dijkV[dijk[i].second]); //nodes[dijk[i].second].sx = nodes[dijk[i].second].sy = {dijkU[dijk[i].second],dijkV[dijk[i].second]}; } /* for (int i = 0;i<n;i++) { cout<<i+1<<" -> "<<endl; cout<<" "<<nodes[i].sx.first<<" "<<nodes[i].sx.second<<endl; cout<<" "<<nodes[i].sy.first<<" "<<nodes[i].sy.second<<endl; } */ int va = nodes[t-1].sx.first + nodes[t-1].sx.second; int vb = nodes[t-1].sy.first + nodes[t-1].sy.second; cout<<min(min(va,vb),dijkU[v-1])<<endl; return 0; }

Compilation message (stderr)

commuter_pass.cpp: In lambda function:
commuter_pass.cpp:59:29: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |             for (int i = 0;i<nodes[f.second].adj.size();i++) {
      |                            ~^~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'int32_t main()':
commuter_pass.cpp:82:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |     for (int i = 0;i<dijk.size();i++) {
      |                    ~^~~~~~~~~~~~
commuter_pass.cpp:83:25: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |         for (int j = 0;j<nodes[dijk[i].second].adj.size();j++) {
      |                        ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...