제출 #1281370

#제출 시각아이디문제언어결과실행 시간메모리
1281370hynmjAirplane (NOI23_airplane)C++20
0 / 100
2 ms560 KiB
#include <bits/stdc++.h>
#define int long long
#define first first
const int N = 2e5 + 7;
using namespace std;
vector<pair<int, int>> graph[N];
int a[N];
vector<int> dijkstra(int start, vector<int> &dist)
{
    set<pair<int, int>> q;
    vector<int> vis(dist.size(), 0);
    q.insert({0, start});
    dist[start] = 0;
    int node, weight;
    while (q.size())
    {
        node = q.begin()->second;
        q.extract(*q.begin());
        if (vis[node])
            continue;
        vis[node] = 1;
        for (auto i : graph[node])
        {
            if (dist[i.second] > dist[node] + 1 + max(dist[node] + 1, a[i.second]) - (dist[node] + 1))
            {
                dist[i.second] = dist[node] + 1 + max(dist[node] + 1, a[i.second]) - (dist[node] + 1);
                q.insert({dist[i.second], i.second});
            }
        }
    }
    return dist;
}

void solve()
{
    int n, m;
    cin >> n >> m;
    // int s, t, l, k;
    // cin >> s >> t >> l >> k;

    int u, v, w;

    for (int i = 0; i < n; i++)
    {
        cin >> a[i + 1];
    }
    for (int i = 0; i < m; i++)
    {
        cin >> u >> v;
        w = 1;
        graph[u].push_back({w, v});
        graph[v].push_back({w, u});
    }
    vector<int> dist1(n + 1, 1e18);
    vector<int> distn(n + 1, 1e18);
    dijkstra(1, dist1);
    dijkstra(n, distn);
    int ans = 1e18;
    for (int i = 1; i <= n; i++)
    {
        cout << dist1[i] << " ";
    }
    cout << endl;
    for (int i = 1; i <= n; i++)
    {
        cout << distn[i] << " ";
    }
    cout << endl;

    for (int i = 1; i < n; i++)
    {
        ans = min(ans, max(dist1[i], distn[i]) * 2);
    }
    for (int i = 0; i < n; i++)
    {
        for (auto j : graph[i])
        {
            ans = min(ans, dist1[i] + 1 + distn[j.second]);
        }
    }    

    cout << ans << endl;
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
        cout << endl;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...