質問の意味:
1からNまでの番号Nの村があり、Nは現在の村の道路との間に必要とされるので、通信は、任意の2つの村の間とすることができます。、A、Bは、2つの村の通信であることを特徴と
AとBとが直接道路、存在または村Cが接続されており、場合だけようにAとCの間に2つの村を結ぶ道路、及びCとBパスの間に接続があります。
いくつかの村の間で知られているように、直接接続、すべての村が接続されるようにテスト経路の一部の構成、及び最短道路の全長。
マトリックス内の2つの与えられた点の間の距離と二行二つの経路を示し、各頁の所定数は、村を修理されました
ソリューション:
最低限のスパニングツリー・ボード
限り道路が建設されているように、右値は0に設定されています
コード:
#include <iostreamの> する#include <stdio.hに> する#include <math.h>の 書式#include <アルゴリズム> の#include <ベクトル> 使用して 名前空間STD。 typedefの長い 長いLL。 CONST INT MAXN = 110 。 INT [MAXN] F。 int型N、CNT、Q。 構造体ノード { int型U、V、W。 ブール 演算子 <(constのノード&A)のconst { リターン <W AW。 } }エッジ[MAXN * MAXN]。 INT検索(int型X) { 戻り X == F [x]はx:F [X] = 検索(F [X])。 } ボイド追加(INT U、INT V、INT W) { エッジ[CNT] .U = U。 エッジ[CNT] .V = V。 エッジ[CNT。++]、W = W。 } INT クラスカル() { int型 ANS = 0 。 以下のために(int型 I = 0 F [I] = iは++; iが<= N)I。 ソート(エッジ、エッジ + CNT)。 int型の合計=0 ; 以下のために(int型 i = 0 ; iはCNT <I ++の) { int型のx = エッジを[I] .U。 INT Y = エッジ[I] .V。 int型の FX = (x)の検索; int型 FY = (y)を見つけます。 もし(!FX = FY) { F [FX] = FY。 ANS + = エッジ[I] .W。 合計 ++ ; } であれば(和== N- 1)ブレーク。 } 戻りANS。 } int型のmain() { ながら(〜のscanf(" %d個"、&N)&& N) { ため(int型 i = 1 ; iが<= N; I ++)のための(INT J = 1 ; J <= N; J ++ ) { int型のX; scanf関数(" %のD "、&x)は、 追加(I、J、X); } int型Q; scanf関数(" %のD "、&Q)。 以下のための(int型 I = 1; I <= Q; iが++ ) { int型、B。 scanf関数(" %D%dの"、&、&B)。 追加(A、B、0 ); } のprintf(" %d個の\ n " 、クラスカル())。 } 戻り 0 。 }