資料檔第1列 一個數字 n ,代表 n 組資料,接著每組資料一列
每一列為一個圖形所有「邊」以空格隔開,「邊」由3個以逗號隔開的數字組成{2個節點及成本}
每組資料印出1個數字,算出圖形的最小成本生成樹的成本。
參考程式碼:
'最小成本生成樹 MST
Const MaxM As Integer = 20 '最多20邊
Const MaxN As Integer = 26 '最多26點
Dim eg(MaxM) As String '邊
Dim ct(MaxM) As Integer '成本
Dim rt(MaxN) '此點的根
Dim ht(MaxN) '此點的高
Dim n As Integer '節點數
Dim m As Integer '邊數
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
FileOpen(1, "in1.txt", OpenMode.Input)
' FileOpen(2, "in2.txt", OpenMode.Input)
FileOpen(3, "out.txt", OpenMode.Output)
For fn = 1 To 1 'in1,in2合成一個
If fn = 2 Then PrintLine(3)
Dim t As Short = LineInput(fn)
For i = 1 To t
Dim egs() = LineInput(fn).Split(" ") '一列為一個樹,多個邊
m = egs.Length '邊數
For j = 0 To m - 1
eg(j) = Strings.Left(egs(j), 3) '一個邊
ct(j) = Val(Mid(egs(j), 5)) ' 這個邊的 成本
Next
Array.Sort(ct, eg, 0, m)
Array.Clear(ht, 0, MaxN)
For j = 0 To MaxN
rt(j) = j
Next
Dim ans = 0
For j = 0 To m - 1
Dim x As Integer = Asc(Mid(eg(j), 1, 1)) - 65
Dim y As Integer = Asc(Mid(eg(j), 3, 1)) - 65
If same(x, y) Then Continue For
ans += ct(j) '不是同一 根 就將成本加入 ans
uni(x, y) '將x,y合併
Print(3, "+" & ct(j) & eg(j) & " ") '測試用列印
Next
PrintLine(3, "ans=" & ans) '測試用列印
Next i
Next fn
End
End Sub
Function fdrt(ByVal x As Integer) As Integer '找 x 的根
If rt(x) = x Then Return x
rt(x) = fdrt(rt(x))
Return rt(x)
End Function
Function same(ByVal x As Integer, ByVal y As Integer)
Return (fdrt(x) = fdrt(y)) ' x,y 的根是否相同
End Function
Sub uni(ByVal x As Integer, ByVal y As Integer) '將 x樹 及 y樹 合成一樹
x = fdrt(x) : y = fdrt(y)
If x = y Then Return
If ht(x) < ht(y) Then
rt(x) = y
Else
rt(y) = x
If ht(x) = ht(y) Then ht(x) += 1
End If
End Sub
'輸入 in1.txt 併 in2
4
A,B,6 A,E,9 B,C,3 B,D,5 C,D,7 B,F,8 D,E,10 D,F,11 A,F,12 E,F,15
A,B,3 A,C,2 B,C,1 B,D,2 C,D,1 B,E,2 C,F,1 D,E,1 D,F,1 D,G,2 E,G,1 F,G,1
B,A,6 B,F,8 B,D,5 D,E,10 D,F,9 A,F,12 A,E,10 E,F,15
D,E,1 D,G,2 D,F,1 E,G,1 F,G,1
輸出:第1組 31 , 第2組 7 , 第3組 29 , 第4組 3
31
7
29
3
參考:
+3B,C +5B,D +6A,B +8B,F +9A,E ans=31
+1C,D +1D,F +1D,E +1F,G +1B,C +2A,C ans=7
+5B,D +6B,A +8B,F +10A,E ans=29
+1E,G +1F,G +1D,F ans=3
0 意見:
張貼留言