Submission #833039

#TimeUsernameProblemLanguageResultExecution timeMemory
833039SaacootaCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
283 ms26680 KiB
#include    <bits/stdc++.h>
#define fo(i,a,b) for(int i=(a);i<=(b);++i)
#define fd(i,a,b) for(int i=(a);i>=(b);--i)
#define rep(i,a,b)  for(int i=(a);i<(b);++i)
#define fi  first
#define se  second
#define LL  unsigned long long
#define uint unsigned int
#define pb  push_back
#define eb  emplace_back
#define bit(s,i) ((s >> i) & 1)
#define off(s,i) (s & (~ (1 << i)))
#define ii pair <long long , int>
#define iii1 pair <ii , int>
#define iii2 pair <int , ii>
#define TASK "commuter"
using   namespace   std;
const long long inf = 0x3f3f3f3f3f3f3f3f;
const int maxn = 1e5 + 5;
int n , m , tim , s , t;
long long d[maxn][4] , dp[maxn] , res , ans;
ii a[maxn];
bool vs[maxn] ;
vector < ii > g[maxn];
vector < int > adj[maxn];
///--------------------------
void dijkstra(int u,int ty) {
    priority_queue < ii , vector < ii > , greater < ii > > pt;
    d[u][ty] = 0;
    pt.push({d[u][ty] , u});
    while (!pt.empty()) {
        ii x = pt.top();
        pt.pop();
        long long dis = x.fi;
        int u = x.se;
        if (dis != d[u][ty]) continue;
        for (auto v : g[u]) {
            if (d[v.fi][ty] > dis + v.se) {
                d[v.fi][ty] = dis + v.se;
                pt.push({d[v.fi][ty] , v.fi});
            }
        }
    }
}
///--------------------------
void readf() {
    int u , v;
    cin >> n >> m >> s >> t >> u >> v;
    for (int i = 1 ; i <= m ; ++i) {
        int u , v , w;
        cin >> u >> v >> w;
        g[u].eb(v , w);
        g[v].eb(u , w);
    }
    memset(d,inf,sizeof(d));
    memset(dp,inf,sizeof(dp));
    dijkstra(s,0);
    dijkstra(u,1);
    dijkstra(v,2);
    dijkstra(t,3);
    ans = res = d[v][1];
}
///--------------------------
bool in(int u) {
    return (d[u][0] + d[u][3] == d[t][0]);
}
///--------------------------
void solve() {
    for (int i = 1 ; i <= n ; ++i) a[i] = ii(d[i][0] , i);
    sort(a + 1 , a + n + 1);

    for (int u = 1 ; u <= n ; ++u)
    if (in(u)) dp[u] = d[u][2];
    for (int i = n ; i > 0 ; --i) {
        int u = a[i].se;
        if (!in(u)) continue;
        for (auto v : g[u])
        if (in(v.fi) && d[v.fi][0] == d[u][0] + v.se) {
            dp[u] = min(dp[u] , dp[v.fi]);
        }
    }
    for (int u = 1 ; u <= n ; ++u)
    if (in(u)) res = min(res , dp[u] + d[u][1]);

    memset(dp,inf,sizeof(dp));
    for (int u = 1 ; u <= n ; ++u)
    if (in(u)) dp[u] = d[u][1];
    for (int i = n ; i > 0 ; --i) {
        int u = a[i].se;
        if (!in(u)) continue;
        for (auto v : g[u])
        if (in(v.fi) && d[v.fi][0] == d[u][0] + v.se) {
            dp[u] = min(dp[u] , dp[v.fi]);
        }
    }
    for (int u = 1 ; u <= n ; ++u)
    if (in(u)) res = min(res , dp[u] + d[u][2]);
    cout << res << '\n';
}
///--------------------------
void solve1() {
    for (int u = 1 ; u <= n ; ++u)
    for (int v = 1 ; v <= n ; ++v)
    if (in(u) && in(v)) ans = min(ans , d[u][1] + d[v][2]);
    cout << ans << '\n';
}
///--------------------------
int main() {
   #ifdef BDP0509
       freopen(TASK".inp", "r", stdin);
       freopen(TASK".out", "w", stdout);
   #endif // ONLINE_JUDGE
   ios::sync_with_stdio(0);
   cin.tie(0);cout.tie(0);
   readf();
   solve();
   //solve1();
}

Compilation message (stderr)

commuter_pass.cpp: In function 'void readf()':
commuter_pass.cpp:55:14: warning: overflow in conversion from 'long long int' to 'int' changes value from '4557430888798830399' to '1061109567' [-Woverflow]
   55 |     memset(d,inf,sizeof(d));
      |              ^~~
commuter_pass.cpp:56:15: warning: overflow in conversion from 'long long int' to 'int' changes value from '4557430888798830399' to '1061109567' [-Woverflow]
   56 |     memset(dp,inf,sizeof(dp));
      |               ^~~
commuter_pass.cpp: In function 'void solve()':
commuter_pass.cpp:85:15: warning: overflow in conversion from 'long long int' to 'int' changes value from '4557430888798830399' to '1061109567' [-Woverflow]
   85 |     memset(dp,inf,sizeof(dp));
      |               ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...