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(最小生成树)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。