學校有n臺計算機,為了方便資料傳輸,現要將它們用資料線連線起來。兩台計算機被連線是指它們之間有資料線連線。由於計算機所處的位置不同,因此不同的兩台計算機的連線費用往往是不同的。
當然,如果將任意兩台計算機都用資料線連線,費用將是相當龐大的。為了節省費用,我們採用資料的間接傳輸手段,即一台計算機可以間接的通過若干臺計算機(作為中轉)來實現與另一台計算機的連線。
現在由你負責連線這些計算機,你的任務是使任意兩台計算機都連通(不管是直接的或間接的)。
第一行為整數n(2<=n<=100),表示計算機的數目。此後的n行,每行n個整數。第x+1行y列的整數表示直接連線第x臺計算機和第y臺計算機的費用。
乙個整數,表示最小的連線費用。
301
2101
210
2
表示連線1和2,2和3,費用為2
其實這道題就是一道最小生成樹,我們這裡用三種方法來做。
這道題我們可以用乙個叫做普里姆演算法(prim)的東西做。
這個演算法採用「藍白點」的思想,每次迴圈都會把乙個藍點(未進入樹的點)變成白點(進入樹的點),且這個藍點與白點相連的最小邊權還是當前所有藍點中最小的。
#include
#include
using
namespace std;
int n,a[
101]
[101
],ans[
101]
,answer;
bool in[
101]
;int
main()
printf
("%d"
,answer)
;//輸出
return0;
}
上面的我們是用鄰接矩陣來做的,那麼呢,我們還可以用鄰接表來做。
下面就是我的菜雞**。
注:本人菜,指標記於上面不同的地方。
#include
#include
#include
using
namespace std;
struct note
e[10001];
int n,le[
10001
],ans[
101]
,answer,k;
bool in[
101]
;int
main()
;le[i]
=k;//建鄰接表
}for
(int i=
1;i<=n;i++
)printf
("%d"
,answer)
;return0;
}
除了上面所說的prim演算法,我們還可以用一種叫做克魯斯卡爾演算法(kruskal)的東西。而且,它還可以配上並查集。
先讓每個點自成乙個集合,然後按權值從小到大列舉邊,如果兩點在不同集合,就連線這兩個點,並且答案要加上邊的權值。
而且,我們還可以優化一下,因為要建成乙個n個點的最小生成樹,你只需要n-1條邊就可以了。那麼,我們可以在列舉邊時記錄下當前加的邊的數量,如果加了之後剛好為n-1條,那麼我們就可以直接退出了。
#include
#include
using
namespace std;
struct note
a[10001];
int n,f[
101]
,k,answer,u;
intfind
(int x)
//尋找這個點的根節點
void
connect
(int x,
int y)
//連線著兩個點
bool
cmp(note x,note y)
intmain()
;//記錄}}
sort
(a+1
,a+k+
1,cmp)
;//根據邊的距離從小到大排序
for(
int i=
1;i<=k;i++)if
(find
(a[i]
.x)!=
find
(a[i]
.y))
//如果兩個點不相連
printf
("%d"
,answer)
;//輸出
return0;
}
三種方法實現選擇問題
一 選擇問題 選擇問題 selection problem 是求一陣列 n個數 中第k k n 個最小元素的問題。二 三種方法實現 1.確定演算法 lomuto劃分 hoare劃分 2.非確定演算法 概率演算法 sherwood演算法 三 lomuto劃分1 include include usin...
三種方法 2020 11 23
利用連線類,例項化得到連線物件 連線類 連線物件 new 連線類 cmd.executescalar cmd.excutereader 關注其中一條資料 物件名.read 獲取關注列所對應的值 console.writeline 物件名 name while 物件名.read 功能,聚焦下一行資料。...
tomcat deploy專案三種方法
其中path制定訪問url路徑,docbase專案真是路徑 privileged true antiresourcelocking false antijarlocking false type org.apache.catalina.userdatabase 其中,docbase與第二種方式中的含...