UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#213154#2675. Road ReformKXG300ms532kbC++112.1kb2024-11-09 21:34:242024-11-09 23:22:03

answer

#include <cstdio>
#include <algorithm>
using namespace std;
const int B = 200;
struct edge {
    int x, y;
    long long s;
} E[200010];
int n, m;
long long k;
bool cmp1(edge a, edge b) {
    return a.s > b.s;
}
bool cmp2(edge a, edge b) {
    return a.s < b.s;
}
int fa[200010];
void init() {
    for (int i = 1; i <= n; i++) {
        fa[i] = i;
    }
}
int find(int x) {
    if (fa[x] == x) return x;
    return fa[x] = find(fa[x]);
}
long long kruscal(int su, int sv) {
    init();
    int cnt = 0;
    long long res = 0;
    if (su != 0) {
        fa[su] = sv;
        cnt = 1;
    } else {
        res = 1e18;
    }
    for (int i = 1; i <= m; i++) {
        if (su != 0 || E[i].s <= k) {
            int fu = find(E[i].x), fv = find(E[i].y);
            if (fu != fv) {
                fa[fu] = fv;
                cnt++;
                if (su != 0) res += max(0ll, E[i].s - k);
                else res = min(res, max(0ll, k - E[i].s));
                if (cnt == n - 1) {
                    return res;
                }
            }
        }
    }
    if (cnt < n - 1) {
        return -1;
    }
}
int main() {
    scanf("%d%d%lld", &n, &m, &k);
    for (int i = 1; i <= m; i++) {
        scanf("%d%d%lld", &E[i].x, &E[i].y, &E[i].s);
    }
    long long ans = 1e18;
    sort(E + 1, E + m + 1, cmp1);
    long long ans1 = kruscal(0, 0);
    if (ans1 != -1) {
        ans = ans1;
    }
    sort(E + 1, E + m + 1, cmp2);
    int pos = 0;
    for (int i = 1; i <= m; i++) {
        if (E[i].s >= k) {
            pos = i;
            break;
        }
    }
    if (pos == 0) {
        printf("%lld\n", ans);
        return 0;
    }
    if (n <= 2000) {
        for (int i = pos; i <= m; i++) {
            ans = min(ans, E[i].s - k + kruscal(E[i].x, E[i].y));
        }
    } else {
        for (int i = pos; i <= min(pos + B - 1, m); i++) {
            ans = min(ans, E[i].s - k + kruscal(E[i].x, E[i].y));
        }
        for (int i = max(pos, m - B + 1); i <= m; i++) {
            ans = min(ans, E[i].s - k + kruscal(E[i].x, E[i].y));
        }
    }
    printf("%lld\n", ans);
    return 0;
}

Details

小提示:点击横条可展开更详细的信息

Test #1:

score: 5
Accepted
time: 0ms
memory: 528kb

input:

20 80 10
11 10 207
8 15 45
2 9 253
10 8 91
10 14 174
20 19 272
20 3 69
4 7 9
19 12 192
3 5 21
20 1 2...

output:

651

result:

ok single line: '651'

Test #2:

score: 5
Accepted
time: 0ms
memory: 528kb

input:

20 80 10
8 15 24
16 14 128
7 9 8
6 1 12
4 11 273
9 14 238
8 17 155
11 5 220
15 10 132
17 7 10
9 18 1...

output:

569

result:

ok single line: '569'

Test #3:

score: 5
Accepted
time: 0ms
memory: 528kb

input:

20 80 10
1 13 196
6 2 133
11 14 193
4 11 148
11 19 21
16 15 84
3 19 201
5 15 286
11 16 161
12 13 296...

output:

633

result:

ok single line: '633'

Test #4:

score: 5
Accepted
time: 0ms
memory: 532kb

input:

20 80 10
5 15 33
9 13 52
9 5 48
8 3 251
6 9 281
8 9 111
18 17 48
8 14 145
19 15 299
4 20 88
6 2 281
...

output:

596

result:

ok single line: '596'

Test #5:

score: 5
Accepted
time: 0ms
memory: 528kb

input:

20 80 10
6 15 124
7 15 242
6 5 172
11 2 46
3 4 273
2 4 173
7 9 175
9 16 264
17 14 15
16 17 211
8 18 ...

output:

989

result:

ok single line: '989'

Test #6:

score: 5
Accepted
time: 0ms
memory: 532kb

input:

20 80 10
6 5 252
2 20 182
20 14 107
5 15 128
4 10 283
8 17 21
2 17 203
9 4 289
18 4 218
3 15 25
10 9...

output:

571

result:

ok single line: '571'

Test #7:

score: 0
Time Limit Exceeded

input:

2000 100000 800
1287 1255 1987
1744 883 836
149 1453 1336
351 1172 1071
850 1465 848
740 1675 863
11...

output:


result:


Test #8:

score: 0
Time Limit Exceeded

input:

2000 100000 800
540 62 1546
684 1940 1135
506 1341 1784
1850 361 1977
18 140 1635
1651 1916 1907
199...

output:


result:


Test #9:

score: 0
Time Limit Exceeded

input:

2000 100000 800
1450 642 1197
990 388 1850
1656 809 1402
725 786 1349
613 1059 890
1259 1575 1064
95...

output:


result:


Test #10:

score: 0
Time Limit Exceeded

input:

2000 100000 10000000
232 194 5205389
1290 1320 94756446
1596 1172 8604877
1838 1057 38095640
1301 54...

output:


result:


Test #11:

score: 0
Time Limit Exceeded

input:

2000 100000 10000000
1377 361 48147042
1023 1928 5049880
1696 843 14727225
920 1294 58661444
1665 51...

output:


result:


Test #12:

score: 0
Time Limit Exceeded

input:

2000 100000 10000000
23 1840 61297021
1090 1814 98946038
1413 1691 85852947
86 1463 92991569
1268 82...

output:


result:


Test #13:

score: 0
Time Limit Exceeded

input:

200000 200000 10000000
163447 52269 827108961
69433 60328 8764874
184517 157379 878957413
2825 13277...

output:


result:


Test #14:

score: 0
Time Limit Exceeded

input:

200000 200000 10000000
26437 26449 733968315
72457 129890 760533116
45625 117585 453891083
113120 65...

output:


result:


Test #15:

score: 0
Time Limit Exceeded

input:

200000 200000 10000000
134481 172469 958604013
187505 51187 883335613
78523 97379 748522908
76899 44...

output:


result:


Test #16:

score: 0
Time Limit Exceeded

input:

200000 200000 10000000
31044 159067 847353551
87451 43252 982699932
138867 5542 154557540
83604 6864...

output:


result:


Test #17:

score: 0
Time Limit Exceeded

input:

200000 200000 10000000
19846 69397 59750638
19566 101018 183206436
7465 190436 164547218
192600 1650...

output:


result:


Test #18:

score: 0
Time Limit Exceeded

input:

200000 200000 10000000
75029 14324 856954422
6328 45799 557275111
92416 7355 61760133
58432 149196 6...

output:


result:


Test #19:

score: 0
Time Limit Exceeded

input:

200000 200000 10000000
50062 13355 435813272
161002 4865 505414563
118169 48194 579627562
139289 413...

output:


result:


Test #20:

score: 0
Time Limit Exceeded

input:

200000 200000 10000000
5476 97888 999474454
20665 24758 972246854
170123 118973 486801275
114106 174...

output:


result: