QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#646128 | #6402. MEXimum Spanning Tree | crimsonsunset# | RE | 1039ms | 3972kb | C++20 | 5.0kb | 2024-10-16 21:23:08 | 2024-10-16 21:23:08 |
Judging History
answer
#pragma GCC optimize("O3,unroll-loops,inline")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
//#define int ll
#define ff first
#define ss second
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
constexpr int INF = 1e9;
struct edge {
int u, v, c;
};
int idi_naxui(vector<edge> &e, int n) {
int m = e.size();
vector<int> j;
while (true) {
vector<int> x1, x2, color(m, 0);
for (int i : j)
++color[e[i].c];
vector<bool> used(m, false);
for (int i : j)
used[i] = true;
// vector<vector<int>> gr(m);
for (int k = 0; k < m; ++k)
if (!used[k])
if (color[e[k].c] == 0)
x2.push_back(k);
vector<int> comp(n, -1);
int cnt = 0;
vector<vector<int>> trees(n);
auto dfs = [&](auto dfs, int v, int p, vector<int>& c) -> void {
c[v] = cnt;
for (int u : trees[v])
if (u != p)
dfs(dfs, u, v, c);
};
for (int q = 0; q < j.size(); ++q) {
trees[e[j[q]].u].push_back(e[j[q]].v);
trees[e[j[q]].v].push_back(e[j[q]].u);
}
for (int i = 0; i < n; ++i)
if (comp[i] == -1) {
dfs(dfs, i, -1, comp);
++cnt;
}
for (int k = 0; k < m; ++k)
if (!used[k])
if (comp[e[k].u] != comp[e[k].v])
x1.push_back(k);
auto calc = [&](int i) -> vector<int> {
vector<int> res;
if (used[i]) {
for (int q = 0; q < n; ++q)
trees[q].clear();
for (int q = 0; q < j.size(); ++q)
if (j[q] != i) {
trees[e[j[q]].u].push_back(e[j[q]].v);
trees[e[j[q]].v].push_back(e[j[q]].u);
}
cnt = 0;
vector<int> cd(n, -1);
for (int k = 0; k < n; ++k)
if (cd[k] == -1) {
dfs(dfs, k, -1, cd);
++cnt;
}
for (int k = 0; k < m; ++k)
if (!used[k]) {
if (comp[e[k].u] != comp[e[k].v])
res.push_back(k);
else if (cd[e[k].u] != cd[e[k].v])
res.push_back(k);
}
} else {
for (int k = 0; k < j.size(); ++k)
if (color[e[i].c] == 0)
res.push_back(j[k]);
else if (e[i].c == e[j[k]].c)
res.push_back(j[k]);
}
return res;
};
if (x1.empty() || x2.empty()) {
break;
}
vector<bool> inx1(m, false), inx2(m, false);
for (int i = 0; i < x1.size(); ++i)
inx1[x1[i]] = true;
for (int i = 0; i < x2.size(); ++i)
inx2[x2[i]] = true;
bool fl = false;
for (int i = 0; i < m; ++i)
if (inx1[i] && inx2[i]) {
j.push_back(i);
fl = true;
break;
}
if (fl)
continue;
// vector<bool> cgr(m, false);
vector<int> dist(m, INF), prev(m, -1);
deque<int> bfs;
for (int i = 0; i < x1.size(); ++i)
bfs.push_back(x1[i]), dist[x1[i]] = 0;
while (!bfs.empty()) {
int v = bfs.front();
bfs.pop_front();
for (int u : calc(v))
if (dist[v] + 1 < dist[u]) {
dist[u] = dist[v] + 1;
bfs.push_back(u);
prev[u] = v;
}
}
int ind = x2[0];
for (int i = 1; i < x2.size(); ++i)
if (dist[x2[i]] < dist[ind])
ind = x2[i];
if (dist[ind] == INF)
break;
vector<int> rebuild(m, 0);
for (int i : j)
rebuild[i] ^= 1;
int last = ind;
while (last != -1) {
rebuild[last] ^= 1;
last = prev[last];
}
vector<int> new_j;
for (int i = 0; i < m; ++i)
if (rebuild[i])
new_j.push_back(i);
j = new_j;
}
return j.size();
}
void solve() {
int n, m;
cin >> n >> m;
vector<edge> e(m);
for (auto &i: e)
cin >> i.u >> i.v >> i.c, --i.u, --i.v;
int l = 0, r = m + 1;
while (r - l > 1) {
int mid = (l + r) / 2;
vector<edge> ee;
for (auto i : e)
if (i.c < mid)
ee.push_back(i);
if (idi_naxui(ee, n) == mid)
l = mid;
else
r = mid;
}
cout << l;
}
signed main() {
cin.tie(nullptr)->sync_with_stdio(false);
int t = 1;
// cin >> t;
while (t--) solve();
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3788kb
input:
4 4 1 2 0 2 3 1 1 3 1 3 4 2
output:
3
result:
ok 1 number(s): "3"
Test #2:
score: 0
Accepted
time: 137ms
memory: 3768kb
input:
1000 1000 647 790 6 91 461 435 90 72 74 403 81 240 893 925 395 817 345 136 88 71 821 831 962 53 164 270 298 14 550 317 99 580 81 26 477 488 977 474 861 413 483 167 872 675 17 819 327 449 594 242 68 381 983 319 867 582 358 869 225 669 274 352 392 40 388 998 246 477 44 508 979 286 483 776 71 580 438 6...
output:
502
result:
ok 1 number(s): "502"
Test #3:
score: 0
Accepted
time: 1039ms
memory: 3916kb
input:
900 1000 232 890 107 425 399 19 5 74 753 105 333 163 779 42 582 359 647 524 767 409 48 239 780 443 484 489 546 97 634 562 627 866 714 500 357 590 60 728 591 407 686 210 547 32 370 76 772 500 407 584 772 73 699 69 332 847 516 829 754 727 562 756 678 819 303 128 781 667 263 535 672 767 89 762 216 878 ...
output:
801
result:
ok 1 number(s): "801"
Test #4:
score: 0
Accepted
time: 554ms
memory: 3944kb
input:
500 1000 381 118 230 258 331 21 403 71 207 170 2 125 467 99 6 369 100 492 70 187 352 99 163 123 135 51 352 461 175 486 275 194 236 299 14 19 16 1 68 7 229 316 235 433 320 411 179 463 112 329 326 464 169 52 377 93 51 84 336 335 42 240 379 182 496 344 377 481 195 88 286 491 199 425 165 37 292 44 197 2...
output:
403
result:
ok 1 number(s): "403"
Test #5:
score: 0
Accepted
time: 955ms
memory: 3972kb
input:
900 1000 698 454 775 6 762 755 585 346 86 220 245 253 54 634 184 634 249 234 454 363 546 520 799 501 103 346 134 381 346 792 835 782 614 359 220 485 634 68 54 411 220 439 701 364 791 220 876 15 70 346 317 220 461 769 577 431 117 488 107 706 160 39 864 220 172 721 431 400 556 801 364 716 37 845 83 99...
output:
801
result:
ok 1 number(s): "801"
Test #6:
score: 0
Accepted
time: 479ms
memory: 3648kb
input:
500 1000 7 326 457 269 363 262 414 164 422 416 321 391 37 180 315 304 212 80 483 439 185 221 55 236 456 428 164 401 142 133 42 197 327 366 389 181 125 492 347 220 277 308 316 426 192 29 95 268 50 87 366 62 394 136 480 255 287 363 39 366 489 103 302 477 370 418 16 82 259 374 398 298 77 224 64 402 474...
output:
404
result:
ok 1 number(s): "404"
Test #7:
score: -100
Runtime Error
input:
1000 1000 404 572 946 963 590 625 691 563 394 297 369 699 379 667 345 285 219 775 860 851 693 393 962 118 78 19 178 986 466 284 14 709 603 897 698 491 432 875 675 268 886 372 599 1000 151 938 435 978 554 22 577 53 804 686 932 195 192 974 100 267 195 219 790 545 242 669 720 623 317 181 514 48 75 373 ...