제출 #824273

#제출 시각아이디문제언어결과실행 시간메모리
824273trangtranha28Commuter Pass (JOI18_commuter_pass)C++14
100 / 100
282 ms43888 KiB
#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <climits>
#include <vector>
#include <queue>
#include <map>
#include <set>
#define int long long
using namespace std;

const int MAXN = 1e5 + 2;

int n, m;
int s, t, src, tar;

int dis[MAXN] = {0}, dis2[4][MAXN] = {0};
bool vis[MAXN] = {false};

vector <pair <int, int> > adj[MAXN];
vector <int> pp[MAXN], adj2[MAXN], radj[MAXN];

void Dijkstra() {
	// reset:
	memset(dis, 0x3f3f3f3f, sizeof(dis));
	memset(dis2, 0x3f3f3f3f, sizeof(dis2));
	dis[s] = 0;
    
    priority_queue <pair <int, int>, vector <pair <int, int> >, greater <pair <int, int> > > pq;
    pq.push(make_pair(dis[s], s));
    
    while(pq.empty() == false) {
    	pair <int, int> p = pq.top();
    	pq.pop();
    	
    	int d = p.first;
    	int v = p.second;
				
        if(d != dis[v]) {
        	continue;
		}
		
        for(int i = 0; i < (int)(adj[v].size()); i++) {
        	int u = adj[v][i].first;
        	int w = adj[v][i].second;
        	
            if(dis[u] > dis[v] + w) {
            	dis[u] = dis[v] + w;
                pq.push(make_pair(dis[u], u));
                pp[u] = {v};
            } else if(dis[u] == dis[v] + w) {
            	pp[u].push_back(v);
			}
        }
    }
    return;
}

void programme() {
	// input:
    cin >> n >> m >> s >> t >> src >> tar;
    
    for(int i = 1; i <= m; i++) {
        int a, b, w;
		cin >> a >> b >> w;
        adj[a].push_back(make_pair(b, w));
        adj[b].push_back(make_pair(a, w));
    }
    
    // solve:
	Dijkstra();
    
    queue <int> q;
	q.push(t);
	
	vis[t] = true;
	
    while(q.empty() == false) {
        int v = q.front();
		q.pop();
		
        for(int i = 0; i < (int)(pp[v].size()); i++) {
        	int u = pp[v][i];
            adj2[v].push_back(u);
            radj[u].push_back(v);
            
            if(vis[u] == false) {
            	vis[u] = true;
				q.push(u);
			}
        }
    }
    
    // find ans:
    priority_queue <pair <int, pair <int, int> >, vector <pair <int, pair <int, int> > >, greater <pair <int, pair <int, int> > > > q2;
    dis2[0][src] = 0;
	q2.push(make_pair(dis2[0][src], make_pair(0, src)));
    
    while(q2.empty() == false) {
        auto[d, x] = q2.top();
		q2.pop();
        auto[i, v] = x;
        if(v == tar) {
        	cout << d << "\n";
			return;
		}
        if (d != dis2[i][v]) continue;
        for (auto[u, w]: adj[v]){
            int ni = (!i? 0 : 3);
            if (dis2[ni][u] > dis2[i][v]+w){
                q2.push({dis2[ni][u] = dis2[i][v]+w, {ni, u}});
            }
        }
        if (!i || i == 1){
            for (int u: adj2[v]){
                if (dis2[1][u] > dis2[i][v]){
                    q2.push({dis2[1][u] = dis2[i][v], {1, u}});
                }
            }
        }
        if (!i || i == 2){
            for (int u: radj[v]){
                if (dis2[2][u] > dis2[i][v]){
                    q2.push({dis2[2][u] = dis2[i][v], {2, u}});
                }
            }
        }
    }
    return;
}

signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
//	freopen("_mint.inp", "r", stdin);
//	freopen("_mint.out", "w", stdout);
	
	programme();
    return 0;
}

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

commuter_pass.cpp: In function 'void programme()':
commuter_pass.cpp:101:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  101 |         auto[d, x] = q2.top();
      |             ^
commuter_pass.cpp:103:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  103 |         auto[i, v] = x;
      |             ^
commuter_pass.cpp:109:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  109 |         for (auto[u, w]: adj[v]){
      |                  ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...