社区讨论
是不是BUG啊,蜜汁TLE
P1967[NOIP 2013 提高组] 货车运输参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mi6w6ypk
- 此快照首次捕获于
- 2025/11/20 11:49 4 个月前
- 此快照最后确认于
- 2025/11/20 11:49 4 个月前
交上去没过几秒钟全部TLE,下了第一个数据用在线IDE跑没毛病。。。
CPP#include<bits/stdc++.h>
using namespace std;
const int maxn = 10000 + 5;
const int maxm = 50000 + 5;
const int maxq = 30000 + 5;
int n, m, q;
int root, fa[maxn + maxm], deep[maxn + maxm], size[maxn + maxm], son[maxn + maxm], top[maxn + maxm];
bool used[maxn + maxm];
struct Node {
int u, v, z;
bool operator<(const Node &r) const {
return z > r.z;
}
} node[maxn + maxm];
int pre[maxn + maxm];
int find(int x) { return pre[x] ? pre[x] = find(pre[x]) : x; }
void inline Debug();
void inline Init()
{
cin >> n >> m;
int u, v, z;
for(int i = 1; i <= m; ++i) {
cin >> u >> v >> z;
node[i + n] = (Node) { u, v, z };
}
sort(node + n + 1, node + n + m + 1);
}
void inline Kruskal()
{
for(int i = n + 1; i <= n + m + 1; ++i) {
int u =node[i].u, v = node[i].v;
if(find(u) == find(v)) continue;
// cout << "Connect " << find(u) << ' ' << find(v) << " with " << i << endl;
node[i].u = find(u), node[i].v = find(v);
fa[find(u)] = fa[find(v)] = pre[find(u)] = pre[find(v)] = i;
used[i] = true;
}
}
void dfs1(int i)
{
size[i] = 1;
int u = node[i].u, v = node[i].v;
if(!u) return;
deep[u] = deep[v] = deep[i] + 1;
// cout << "In " << i << ", left is " << u << ", right is " << v << endl;
dfs1(u);
dfs1(v);
size[i] += size[u] + size[v];
if(size[u] > size[v]) son[i] = u;
else son[i] = v;
// cout << "Out " << i << ", size is " << size[i] << ", hson is " << son[i] << endl;
}
void dfs2(int i)
{
int u = node[i].u, v = node[i].v;
if(!u) return;
if(son[i] == u) {
top[u] = top[i];
top[v] = v;
} else {
top[u] = u;
top[v] = top[i];
}
dfs2(u); dfs2(v);
}
int inline lca(int u, int v)
{
while(top[u] != top[v]) {
if(deep[top[u]] > deep[top[v]]) u = fa[top[u]];
else v = fa[top[v]];
}
return deep[u] < deep[v] ? u : v;
}
void inline Solve()
{
cin >> q;
int u, v;
Kruskal();
top[root] = root;
for(int i = n + 1; i <= n + m + 1; ++i) {
if(used[i] && !fa[i]) {
top[i] = i;
deep[i] = 0;
dfs1(i), dfs2(i);
}
}
for(int i = 1; i <= n; ++i) if(!fa[i]) top[i] = i;
// Debug();
while(q--) {
cin >> u >> v;
cout << (find(u) == find(v) ? node[lca(u, v)].z : -1) << endl;
}
}
void inline Debug()
{
cout << "Debuging------------------------\n";
for(int i = 1; i <= n + m + 1; ++i) {
cout << top[i] << endl;
}
cout << "End Debug-----------------------\n";
}
int main()
{
Init();
Solve();
return 0;
}


kkksc03chen_zhelin_toto
回复
共 4 条回复,欢迎继续交流。
正在加载回复...