제출 #294975

#제출 시각아이디문제언어결과실행 시간메모리
294975thebesCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
502 ms31212 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<ll,ll> pll;
#define F first
#define S second

const int MN = 1e5+5, MM = 2e5+5;
int N, M, i, j, x, y, w, S, T, U, V, ww[MM], nd[4], deg[MN];
vector<pll> adj[MN]; vector<int> dag[MN]; ll dis[4][MN], dp[MN][2], ans;
priority_queue<pll,vector<pll>,greater<pll>> q;
queue<int> Q; pll ed[MM];

inline void dij(int idx){
    memset(dis[idx],-1,sizeof(dis[idx]));
    int st = nd[idx];
    q.push({0, st});
    while(q.size()){
        pll cur = q.top(); q.pop();
        if(dis[idx][cur.S]!=-1) continue;
        dis[idx][cur.S] = cur.F;
        for(auto v : adj[cur.S]){
            if(dis[idx][v.F]!=-1) continue;
            q.push({cur.F+v.S,v.F});
        }
    }
}

int main(){
    scanf("%d%d%d%d%d%d",&N,&M,&S,&T,&U,&V);
    nd[0]=S, nd[1]=T, nd[2]=U, nd[3]=V;
    for(i=1;i<=M;i++){
        scanf("%d%d%d",&x,&y,&w);
        ed[i] = {x, y}; ww[i] = w;
        adj[x].push_back({y, w});
        adj[y].push_back({x, w});
    }
    for(i=0;i<4;i++) dij(i);
    for(i=1;i<=M;i++){
        x = ed[i].F, y = ed[i].S;
        if(dis[0][x]>dis[0][y]) swap(x,y);
        if(dis[0][x]+dis[1][y]+ww[i]==dis[0][T]){
            dag[y].push_back(x);
            deg[x]++;
        }
    }
    ans = 1LL<<60;
    for(i=1;i<=N;i++){
        if(!deg[i]) Q.push(i);
    }
    memset(dp,0x3f,sizeof(dp));
    while(Q.size()){
        x = Q.front(); Q.pop();
        for(i=0;i<2;i++) dp[x][i] = min(dp[x][i], dis[i^2][x]);
        for(i=0;i<2;i++) ans = min(ans, dp[x][i]+dis[i^3][x]);
        for(auto v : dag[x]){
            deg[v] --;
            if(!deg[v]) Q.push(v);
            for(i=0;i<2;i++) dp[v][i] = min(dp[v][i], dp[x][i]);
        }
    }
    printf("%lld\n",ans);
    return 0;
}

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

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:31:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   31 |     scanf("%d%d%d%d%d%d",&N,&M,&S,&T,&U,&V);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:34:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   34 |         scanf("%d%d%d",&x,&y,&w);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...