제출 #519787

#제출 시각아이디문제언어결과실행 시간메모리
519787Dasha_GnedkoEvacuation plan (IZhO18_plan)C++17
100 / 100
603 ms80648 KiB
#include <bits/stdc++.h>

//#include <ext/pb_ds/detail/standard_policies.hpp>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>

//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx2")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4")

using namespace std;

//using namespace __gnu_pbds;
//template <typename T> using ordered_set = tree <T, null_type, less < T >, rb_tree_tag, tree_order_statistics_node_update>;

mt19937 gen(time(0));

#define ll long long
#define ld long double
#define pb push_back
#define F first
#define S second
#define TIME clock() * 1.0 / CLOCKS_PER_SEC
#define sz(a) int32_t(a.size())
#define endl '\n'
//#define int long long

const int N = 1e6 + 100;
const int M = 18;
const int mod = 998244353;
const int inf = 1e9 + 7;

vector < pair < int, int > > g[N];
int ra[N], ans[N], pr[N], u[N];
vector < pair < pair < int, int >, int > > ask[N];

int get(int v)
{
    if (pr[v] == v) return v;
    return pr[v] = get(pr[v]);
}

void unite(int a, int b, int mx)
{
    a = get(a); b = get(b);
    if (a == b) return;
    if (sz(ask[a]) < sz(ask[b])) swap(a, b);
    int uk = 0;
    for(int i = 0; i < sz(ask[b]); i++)
    {
        int x = ask[b][i].F.F, y = ask[b][i].F.S, numb = ask[b][i].S;
        x = get(x); y = get(y);
        if (x == y) continue;
        if (x != a) swap(x, y);
        if (x != a)
        {
            ask[a].pb(ask[b][i]);
            continue;
        }
        ans[numb] = mx;
    }
    ask[b].clear();
    pr[b] = a;
}

int32_t main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#else
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
#endif // LOCAL

    int n, m;
    cin >> n >> m;
    for(int i = 0; i < m; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        x--; y--;
        g[x].pb({y, z});
        g[y].pb({x, z});
    }
    for(int i = 0; i < n; i++)
        ra[i] = inf;
    priority_queue < pair < int, int > > q;
    cin >> m;
    for(int i = 0; i < m; i++)
    {
        int x;
        cin >> x;
        x--;
        q.push({0, x});
        ra[x] = 0;
    }
    int Q;
    cin >> Q;
    for(int i = 0; i < Q; i++)
    {
        int x, y;
        cin >> x >> y;
        x--; y--;
        ask[x].pb({{x, y}, i});
        ask[y].pb({{x, y}, i});
    }
    for(int i = 0; i < n; i++)
        pr[i] = i;
    while (!q.empty())
    {
        int r = -q.top().F, v = q.top().S;
        q.pop();
        for(auto to: g[v])
        {
            if (ra[to.F] > ra[v] + to.S)
            {
                ra[to.F] = ra[v] + to.S;
                q.push({-ra[to.F], to.F});
            }
        }
    }
    vector < pair < int, int > > a;
    for(int i = 0; i < n; i++)
        a.pb({ra[i], i});
    sort(a.rbegin(), a.rend());
    for(auto x: a)
    {
        int v = x.S;
        u[v] = 1;
        for(auto to: g[v])
        {
            if (!u[to.F]) continue;
            unite(v, to.F, x.F);
        }
    }
    for(int i = 0; i < Q; i++)
        cout << ans[i] << endl;
}

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

plan.cpp: In function 'void unite(int, int, int)':
plan.cpp:48:9: warning: unused variable 'uk' [-Wunused-variable]
   48 |     int uk = 0;
      |         ^~
plan.cpp: In function 'int32_t main()':
plan.cpp:116:13: warning: unused variable 'r' [-Wunused-variable]
  116 |         int r = -q.top().F, v = q.top().S;
      |             ^
#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...