社区讨论
圆方树95ptsTLE求改
P4320道路相遇参与者 3已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mbx1bjku
- 此快照首次捕获于
- 2025/06/15 10:16 9 个月前
- 此快照最后确认于
- 2025/11/04 07:10 4 个月前
代码之前还有一个问题就是,我同样的代码提交三次TLE的点都不一样???
CPP#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6+10;
vector<int> g[N], ng[N];
int dfn[N], low[N], T, stk[N], top, cnt;
int f[N][21], dep[N];
int n, m, q;
void tarjan(int u, int fr) {
dfn[u] = low[u] = ++T;
stk[++top] = u;
for(int v : g[u]) {
if(v == fr) continue;
if(dfn[v] == 0) {
tarjan(v, u);
low[u] = min(low[u], low[v]);
if(low[v] >= dfn[u]) {
++cnt;
int x;
do {
x = stk[top--];
ng[x].push_back(cnt);
ng[cnt].push_back(x);
} while(x != v);
ng[u].push_back(cnt);
ng[cnt].push_back(u);
}
} else {
low[u] = min(low[u], dfn[v]);
}
}
}
void dfs(int u, int fr) {
dep[u] = dep[fr] + 1;
f[u][0] = fr;
for(int i = 1; i <= 20; i++)
f[u][i] = f[f[u][i-1]][i-1];
for(int v : ng[u])
if(v != fr)
dfs(v, u);
}
int lca(int u, int v) {
if(dep[u] < dep[v]) swap(u, v);
for(int j = 20; j >= 0; j--)
if(dep[f[u][j]] >= dep[v])
u = f[u][j];
if(u == v) return u;
for(int j = 20; j >= 0; j--)
if(f[u][j] != f[v][j])
u = f[u][j], v = f[v][j];
return f[u][0];
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
int u, v;
for(int i = 1; i <= m; i++) {
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
cnt = n;
tarjan(1, 0);
dfs(1, 0);
cin >> q;
while(q--) {
cin >> u >> v;
int l = lca(u, v);
int ans = (dep[u] + dep[v] - 2 * dep[l] + 2) / 2;
cout << ans << endl;
}
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...