洛谷 P2820 區域網 prim

2022-02-13 14:04:21 字數 1678 閱讀 5848

某個區域網內有n(n<=100)臺計算機,由於搭建區域網時工作人員的疏忽,現在區域網內的連線形成了迴路,我們知道如果區域網形成迴路那麼資料將不停的在迴路內傳輸,造成網路卡的現象。因為連線計算機的網線本身不同,所以有一些連線不是很暢通,我們用f(i,j)表示i,j之間連線的暢通程度,f(i,j)值越小表示i,j之間連線越通暢,f(i,j)為0表示i,j之間無網線連線。

需要解決迴路問題,我們將除去一些連線,使得網路中沒有迴路,並且被除去網線的σf(i,j)最大,請求出這個最大值。

第一行兩個正整數n k

接下來的k行每行三個正整數i j m表示i,j兩台計算機之間有網線聯通,通暢程度為m。

乙個正整數,σf(i,j)的最大值

5 5

1 2 8

1 3 1

1 5 3

2 4 5

3 4 2

8
f(i,j)<=1000

首先,我們需要了解一下有關最小生成樹的知識。

蒟蒻不理解,換一種解釋:

prim演算法或者kruskal演算法。但是一般都會使用kruskal演算法,因為它實用性更強,更加靈活,而且不用建圖。

但是在這裡我們介紹prim演算法

prim演算法的思想和dijstra很像——都是紅白點思想。初始狀態下,除第乙個點(可以是任意乙個點)為紅點外,所有的點都是白點,每一次迴圈找出距離這個紅點最近的白點,把它變成紅點,然後再用這個點去更新其他的白點。就像這樣,直到所有的點都變成紅點。

這個題就是求被除去的長度最大,就是剩下的總長度最小,剩下的總長度就是最小生成樹的邊權和,被除去的總長度=原來總長度-最小生成樹的邊權和。

其中對memset不懂的推薦我的另一篇部落格:

具體實現請見**:

1 #include2 #include//

memset的標頭檔案

3using

namespace

std;

4int m[105][105],n,k,cnt1,cnt2; //

m用來存圖(鄰接矩陣存圖)

5int a[105]; //

a[i]存的是每個點到最小生成樹的最短距離

6int ok[105]; //

ok[i]存的是i這個點是否已經在最小生成樹上

7int

main()

15 memset(a,0x7f,sizeof(a)); //

先把每個點到最小生成樹的距離設定為無窮大。

16 a[1]=0; //

將點1加入最小生成樹,點1到最小生成樹的距離設定為0。

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

22 ok[minn]=1; //

將白點變為紅點,加入最小生成樹

23for(int i=0;i<=n;i++)26}

27for(int i=1;i<=n;i++) cnt2+=a[i]; //

統計最小生成樹的邊權和

28 cout/

相減即為答案

29return0;

30 }

ac**

洛谷 P2820 區域網x

某個區域網內有n n 100 臺計算機,由於搭建區域網時工作人員的疏忽,現在區域網內的連線形成了迴路,我們知道如果區域網形成迴路那麼資料將不停的在迴路內傳輸,造成網路卡的現象。因為連線計算機的網線本身不同,所以有一些連線不是很暢通,我們用f i,j 表示i,j之間連線的暢通程度,f i,j 值越小表...

洛谷P2820 區域網 (最小生成樹)

某個區域網內有n n 100 臺計算機,由於搭建區域網時工作人員的疏忽,現在區域網內的連線形成了迴路,我們知道如果區域網形成迴路那麼資料將不停的在迴路內傳輸,造成網路卡的現象。因為連線計算機的網線本身不同,所以有一些連線不是很暢通,我們用f i,j 表示i,j之間連線的暢通程度,f i,j 值越小表...

2003區域網共享問題

1.開始 執行 gpedit.msc windows設定 安全設定 本地策略 使用者許可權分配 拒絕從網路訪問計算機 如果有guests就刪除 2.開始 執行 gpedit.msc windows設定 安全設定 本地策略 安全選項 帳戶 使用空白密碼的帳戶只允許控制台登入 改為 已禁用 將 網路訪問...