演算法學習 Day8

2022-09-02 12:51:08 字數 3398 閱讀 2551

今天重拾演算法複習。

今天學習了兩個型別的演算法——並查集與最小生成樹(mst)

簡單記錄一下並查集的大致內容。

一、並查集的內容大致作用為查詢當前圖中的點有幾個集合。

該演算法起到查詢分組的情況。通過給定的條件使用陣列記錄該點對應的父節點,倘若兩個點有相同的「祖先」,那他們肯定是屬於同乙個組的。

下面看幾道例題:

某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省**「暢通工程」的目標是使全省任何兩個城鎮間都可以實現交通(但不一定有直接的道路相連,只要互相間接通過道路可達即可)。問最少還需要建設多少條道路?

測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是城鎮數目n ( < 1000 )和道路數目m;隨後的m行對應m條道路,每行給出一對正整數,分別是該條道路直接連通的兩個城鎮的編號。為簡單起見,城鎮從1到n編號。 

注意:兩個城市之間可以有多條道路相通,也就是說

3 31 2

1 22 1

這種輸入也是合法的

當n為0時,輸入結束,該用例不被處理。

對每個測試用例,在1行裡輸出最少還需要建設的道路數目。
示例1

複製

4 2

1 34 3

3 31 2

1 32 3

5 21 2

3 5999 0

0

複製

102

998以及

給定乙個無向圖和其中的所有邊,判斷這個圖是否所有頂點都是連通的。

每組資料的第一行是兩個整數 n 和 m(0<=n<=1000)。n 表示圖的頂點數目,m 表示圖中邊的數目。隨後有 m 行資料,每行有兩個值 x 和 y(0示例1

複製4 3

1 22 3

3 23 2

1 22 3

no

yes

這些題目屬於查詢結果的型別,相對基礎一些。而下面我們介紹下使用克魯斯卡爾來解最小生成樹的問題:

這些題目的思想是在並查集的基礎上進行延伸,一般來說是查詢當前圖中的最優解,此時我們也要使用組的概念,當兩個節點屬於同乙個組的時候,那麼這兩個點就不可以連通。

例如:某省調查鄉村交通狀況,得到的統計表中列出了任意兩村莊間的距離。省**「暢通工程」的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可),並要求鋪設的公路總長度為最小。請計算最小的公路總長度。

測試輸入包含若干測試用例。每個測試用例的第1行給出村莊數目n ( < 100 );隨後的n(n-1)/2行對應村莊間的距離,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間的距離。為簡單起見,村莊從1到n編號。

當n為0時,輸入結束,該用例不被處理。

對每個測試用例,在1行裡輸出最小的公路總長度。
示例1

複製

3

1 2 1

1 3 2

2 3 4

41 2 1

1 3 4

1 4 1

2 3 3

2 4 2

3 4 5

0

複製

3

5

//

//created by 陳平 on 2018/6/5.

//#include

"iostream

"#include

"stdio.h

"#include

"algorithm

"using

namespace

std;

int tree[101

];struct

edgeedges[

6000

];int findroot(inta)}

bool

cmp(edge a,edge b)

intmain()

sort(edges+1,edges+n*(n-1)/2+1

,cmp);

for (int j = 1; j <=n ; ++j)

int ans=0

;

for (int k = 1; k < n*(n-1)/2; ++k)

}cout

}}

面對最小生成樹的問題,我們的思路是將輸入的路徑進行從小到大的排序,並以此取合適的路徑。

省**「暢通工程」的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可)。現得到城鎮道路統計表,表中列出了任意兩城鎮間修建道路的費用,以及該道路是否已經修通的狀態。現請你編寫程式,計算出全省暢通需要的最低成本。

測試輸入包含若干測試用例。每個測試用例的第1行給出村莊數目n ( 1< n < 100 );隨後的 n(n-1)/2 行對應村莊間道路的成本及修建狀態,每行給4個正整數,分別是兩個村莊的編號(從1編號到n),此兩村莊間道路的成本,以及修建狀態:1表示已建,0表示未建。

當n為0時輸入結束。

每個測試用例的輸出佔一行,輸出全省暢通需要的最低成本。
示例1

複製

3

1 2 1 0

1 3 2 0

2 3 4 0

31 2 1 0

1 3 2 0

2 3 4 1

31 2 1 0

1 3 2 1

2 3 4 1

0

複製

3

10

//

//created by 陳平 on 2018/6/6.

//#include

"stdio.h

"#include

"iostream

"#include

"algorithm

"using

namespace

std;

int tree[101

];struct

edgeedges[

6000

];int findroot( inta)}

bool

cmp(edge a,edge b)

intmain()

int ans=0

;

for (int j = 1; j <=n*(n-1)/2 ; ++j)

}sort(edges+1,edges+1+n*(n-1)/2

,cmp);

for (int k = 1; k <=n*(n-1)/2 ; ++k)

}cout

}}

DAY8學習筆記

檔案操作的基本概念 開啟檔案的模式有三種純淨模式 r 預設的 w a。控制操作檔案內容格式的兩種模式 t 預設的 b。大前提 tb模式均不能單獨使用,必須與純淨模式結合使用。t文字模式 1.讀寫檔案都是以字串為單位的。2.只能針對文字檔案。3.必須指定encoding引數。b二進位制模式 1.讀寫檔...

java學習筆記day8

多型 定義 某一類事物的多種存在形式。例 動物中貓,狗。貓這個物件對應的型別是貓型別。貓 x new 貓 同時貓也是動物中的一種,也可以把貓稱為動物。動物 y new 貓 動物是貓和狗具體事物中抽取出來的父型別。父型別引用指向了子類物件。多型 可以理解為事物存在的多種體現形態。人 男人,女人。動物 ...

機器學習基礎DAY8

第八章 線性回歸 先從定義說起 誤差大小 sklearn線性回歸正規方程 梯度下降api sklearn.linear model.linearregression 正規方程 普通最小二乘線性回歸 coef 回歸係數 sklearn.linear model.sgdregressor 梯度下降 通過...