AC
- 最小生成樹,建邊的時候不需要N2{N^2}N2,首先N個點需要N-1條邊,N個點的權值都會被計算,一些頂點會重復計算。我們讓重復計算的點是權值最小的點,就可以保證生成樹權值最小
- 將特殊邊加到邊集里,跑一邊Kruskal
#include <bits/stdc++.h>
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define REP(i, n) for (int i = 1; i <= (n); ++i)
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define N 200006
#define LL long long
using namespace std
;
struct ac
{LL u
, v
, d
;
}g
[N
*2];
LL a
[N
];
int fa
[N
];
int find(int x
) {return x
== fa
[x
] ? x
: fa
[x
] = find(fa
[x
]);
}
int main() {
#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);
#endifint n
, m
;while (scanf("%d %d", &n
, &m
) != EOF) {int pos
= 1;REP
(i
, n
) {scanf("%lld", &a
[i
]);if (a
[i
] < a
[pos
]) pos
= i
;}int len
= 0;REP
(i
, n
) {if (i
== pos
) continue;g
[len
].u
= pos
;g
[len
].v
= i
;g
[len
].d
= a
[pos
] + a
[i
];len
++;}rep
(i
, m
) {scanf("%lld %lld %lld", &g
[len
].u
, &g
[len
].v
, &g
[len
].d
);++len
;}sort(g
, g
+ len
, [&](const ac
&x
, const ac
&y
){return x
.d
< y
.d
;});REP
(i
, n
) fa
[i
] = i
;LL u
, v
, d
, ans
= 0, cnt
= 0;rep
(i
, len
) {u
= g
[i
].u
;v
= g
[i
].v
;d
= g
[i
].d
;if (find(u
) != find(v
)) {fa
[find(u
)] = find(v
);ans
+= d
;if (++cnt
== n
-1) break;}}printf("%lld\n", ans
);}return 0;
}
總結
以上是生活随笔為你收集整理的Codeforces Round #529 (Div. 3) F. Make It Connected(最小生成树)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。