トピック:https://www.luogu.org/problemnew/show/P1550
N + 1個の点の集合は、水の点です。
被験者は、n + 1を見つける最小全域木となります。
WNへW1は、nとn + 1つの側に1に接続されています。
マトリックスの背後にそれぞれの側に接続されています。
コードは以下の通りであります:
#include <ビット/ STDC ++ H> の#define SC(X)のscanf( "%d個"、&x)を 使用して、 名前空間STDを、 int型 N、ANS、CNT = 1 。 構造体のエッジ{ INT から、DIS、であり; ブール 演算子 <(constのエッジ&A)のconst { 戻り DIS> a.disと、 } } E [ 400 << 1 ]。 PRIORITY_QUEUE <エッジ> Q。 INT FA [ 400 ]、ヘッド[ 400 ]。 インラインint型のfind(int型X){ 場合(FA [X] == x)を返すFAを[X]。 他 戻り FAは[X] = 見つける(FA [X])。 } int型のmain() { SC(N)。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ int型、W; SC(W)。 q.push((エッジ){I、N + 1 、W})。 q.push((エッジ){N + 1 、I、W})。 } のために(int型 i = 1 ; iがn = <; I ++ ) のための(INT J = 1 ; J <= N; J ++ ) { INT W; SC(W)。 q.push((エッジ){I、J、W})。 } のための(int型 i = 1 ; iが<= N + 1 ; iが++)FA [I] = I。 一方(CNT <N + 1 ){ エッジe = q.top()。 q.pop(); もし((E見つける。から)==検索(e.to))続けます。 他{ FA [(E。見つけるから)] = (e.to)を見つけます。 CNT ++ ; ANS + = (e.dis)。 } } coutの << ANS << てendl; システム(「一時停止」)。 リターン 0 ; }