社区讨论

0分求调

P1967[NOIP 2013 提高组] 货车运输参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mm4jr7qp
此快照首次捕获于
2026/02/27 15:04
2 周前
此快照最后确认于
2026/03/01 09:35
上周
查看原帖
CPP
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <map>
using namespace std;
const int N = 10005;
int n, m, u, v, w, fa[N], Q;
int lf[N][30], d[N], minu[N][30];
bool flag[N];
vector<int> e[N];
map<pair<int, int>, int> mp;
int find(int x)
{
    if (fa[x] != x)
        fa[x] = find(fa[x]);
    return fa[x];
}
struct E
{
    int x, y, z;
    bool operator<(const E &t) const
    {
        return z < t.z;
    }
};
priority_queue<E> q;
void in()
{
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        mp[make_pair(x, y)] = z;
        mp[make_pair(y, x)] = z;
        E t{x, y, z};
        q.push(t);
    }
}
void kruskal()
{
    for (int i = 1; i <= n; i++)
        fa[i] = i;
    while (!q.empty())
    {
        u = q.top().x;
        v = q.top().y;
        w = q.top().z;
        q.pop();
        if (find(u) != find(v))
        {
            fa[find(u)] = find(v);
            e[u].push_back(v);
            e[v].push_back(u);
        }
    }
}
void dfs(int u, int f)
{
    flag[u] = true;
    d[u] = d[f] + 1;
    lf[u][0] = f;
    if (f == 0)
        minu[u][0] = 2e9;
    else
        minu[u][0] = mp[make_pair(u, f)];
    for (int i = 1; i <= 20; i++)
    {
        int t = lf[u][i - 1];
        if (t == 0)
        {
            lf[u][i] = 0;
            minu[u][i] = minu[u][i - 1];
        }
        else
        {
            lf[u][i] = lf[t][i - 1];
            minu[u][i] = min(minu[u][i - 1], minu[t][i - 1]);
        }
    }
    for (int i = 0; i < e[u].size(); i++)
        if (e[u][i] != f)
            dfs(e[u][i], u);
}
void init()
{
    d[0] = 0;
    for (int i = 1; i <= n; i++)
        flag[i] = false;
    for (int i = 1; i <= n; i++)
        if (flag[i] == false)
            dfs(i, 0);
}
int lca(int x, int y)
{
    if (find(x) != find(y))
        return -1;
    int ans = 2e9;
    if (d[x] < d[y])
        swap(x, y);
    for (int i = 20; i >= 0; i--)
    {
        if (d[lf[x][i]] >= d[y])
        {
            ans = min(ans, minu[x][i]);
            x = lf[x][i];
        }
    }
    if (x == y)
        return ans;
    for (int i = 20; i >= 0; i--)
    {
        if (lf[x][i] != lf[y][i])
        {
            ans = min(ans, min(minu[x][i], minu[y][i]));
            x = lf[x][i];
            y = lf[y][i];
        }
    }
    return min(ans, min(minu[x][0], minu[y][0]));
}
void out()
{
    cin >> Q;
    while (Q--)
    {
        int x, y;
        cin >> x >> y;
        cout << lca(x, y) << "\n";
    }
}
int main()
{
    in();
    kruskal();
    init();
    out();
    return 0;
}
Subtask #1AC
Subtask #0全WA

回复

0 条回复,欢迎继续交流。

正在加载回复...