제출 #1347022

#제출 시각아이디문제언어결과실행 시간메모리
1347022dhuyyyyEvacuation plan (IZhO18_plan)C++20
100 / 100
293 ms94596 KiB
#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define all(s) s.begin(),s.end()
#define sz(s) (int)s.size()

using namespace std;

using ll = long long;
using ii = pair<int,int>;
using aa = array<int,3>;

const int N = 1e5+5;
const int base = 100;
const int INF = 1e18;
const int MOD = 1e9+7;

int n, m, q, u, v, c, k, kc;

int d[N], s[N], t[N], p[N], num[N], depth[N];

ii up[N][20];

vector <ii> edge;

vector <aa> edges;

vector <ii> adj[N], g[N];

priority_queue<ii,vector<ii>,greater<ii>> pq;

void dijkstra(){
    while (!pq.empty()){
        tie(kc,u) = pq.top();
        pq.pop();
        if (kc > d[u]) continue;
        for (ii it : adj[u]){
            if (d[it.fi] > d[u] + it.se){
                d[it.fi] = d[u] + it.se;
                pq.push({d[it.fi],it.fi});
            }
        }
    }
}

int get(int u){
    return (p[u] == u ? u : p[u] = get(p[u]));
}

bool dsu(int u,int v){
    u = get(u);
    v = get(v);
    if (u == v) return 0;
    if (num[u] < num[v]) swap(u,v);
    num[u] += num[v];
    p[v] = u;
    return 1;
}

void dfs(int u,int p){
    up[u][0].fi = p;
    depth[u] = depth[p] + 1;
    for (ii it : g[u]){
        if (it.fi == p) continue;
        up[it.fi][0].se = it.se;
        dfs(it.fi,u);
    }
}

void prepareLCA(){
    for (int j = 1; j <= 19; j++) up[0][j] = {0,INF};
    for (int j = 1; j <= 19; j++){
        for (int i = 1; i <= n; i++){
            up[i][j].fi = up[up[i][j - 1].fi][j - 1].fi;
            up[i][j].se = min(up[i][j - 1].se,up[up[i][j - 1].fi][j - 1].se);
        }
    }
}

int LCA(int u,int v){
    int res = INF;
    if (depth[u] != depth[v]){
        if (depth[u] < depth[v]) swap(u,v);
        int height = depth[u] - depth[v];
        for (int j = 0; j <= 19; j++){
            if (height >> j & 1){
                res = min(res,up[u][j].se);
                u = up[u][j].fi;
            }
        }
    }
    if (u == v) return res;
    int k = __lg(depth[u]);
    for (int j = 19; j >= 0; j--){
        if (up[u][j].fi != up[v][j].fi){
            res = min({res,up[u][j].se,up[v][j].se});
            u = up[u][j].fi;
            v = up[v][j].fi;
        }
    }
    res = min({res,up[u][0].se,up[v][0].se});
    return res;
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    #define name "EXIT"
    if (fopen(name".inp","r")){
        freopen(name".inp","r",stdin);
        freopen(name".out","w",stdout);
    }
    cin >> n >> m;
    for (int i = 1; i <= m; i++){
        cin >> u >> v >> c;
        adj[u].push_back({v,c});
        adj[v].push_back({u,c});
        edge.push_back({u,v});
    }
    cin >> k;
    for (int i = 1; i <= n; i++){
        d[i] = INF;
        num[i] = 1;
        p[i] = i;
    }
    for (int i = 1; i <= k; i++){
        cin >> u;
        pq.push({0,u});
        d[u] = 0;
    }
    dijkstra();
    for (int i = 1; i <= m; i++){
        tie(u,v) = edge[i - 1];
        edges.push_back({min(d[u],d[v]),u,v});
    }
    sort(all(edges),greater<aa>());
    for (aa it : edges){
        c = it[0];
        u = it[1];
        v = it[2];
        if (dsu(u,v)){
            g[u].push_back({v,c});
            g[v].push_back({u,c});
        }
    }
    dfs(1,0);
    prepareLCA();
    cin >> q;
    for (int i = 1; i <= q; i++){
        cin >> u >> v;
        cout << LCA(u,v) << '\n';
    }
    
    return 0;
}

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

plan.cpp: In function 'int main()':
plan.cpp:110:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  110 |         freopen(name".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
plan.cpp:111:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  111 |         freopen(name".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...