社区讨论
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 条回复,欢迎继续交流。
正在加载回复...