最大權森林問題

2021-09-25 18:16:11 字數 1348 閱讀 6659

題目大意:一共n個男的m個女的,要把它們都招募了,但是有r個男女組合親密度,這時候徵募費用就是10000-(已經徵募的人和自己的親密度的最大值),求最小徵募費用

看到這題時我的第一反應畫了個二分圖(雖然我不會二分圖

然後連了r條線,啥都不會……

後來看了大神題解,看完感覺思路是真的簡單

大神思路:

不管男還是女,其實根本沒關係,把它們當成n+m個普通的城市,然後有r條路徑,現在我要把這個n+m個城市連線起來,然後造這個道路的花費是10000-(這個點和已生成的樹上的頂點的最大距離)現在要追求花費最小值,那麼不就是求乙個最大生成樹(在最小生成樹的板子裡改符號就可以了)嘛。

需要注意的點:

1.需要把女生或者男生的編號接到後面,即編號不能重複;

2.此時的n相當於已經變成了n+m,需要一直提醒自己

**如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define pb push_back

using namespace std;

const

int maxn=

50009

;int fa[maxn]

,n,m,r,a,b,c;

intfind

(int x)

intunit

(int x,

int y)

intinit

(int n)

}bool same

(int x,

int y)

struct edge

es[maxn]

;bool cmp

(const edge& a,

const edge& b)

intkruskal()

}return res;

}int

main()

cout<<

10000

*(n+m)

-kruskal()

<}}

補充以下森林的概念:

生成森林:非連通圖中由於每乙個連通分量都是乙個極小的連通子圖。即一顆生成樹可以對應乙個連通分量。所有的這些連通分量的生成樹就構成了森林。

最大生成樹 最大權森林

題意 給定n個男生和m個女生的關係,各個關係具有一定的權值,然後要挑選出所有人,每個人的代價是10000,但挑選人的過程中這些權值就是可以用來減去費用,求cost的min include include include include using namespace std const int m ...

poj3723 招兵 最大權森林

這是 程式設計挑戰 的一道例題,證明網上大神很多都做了,我就簡單說一下易錯點吧。第一點,這個人是從0開始查的,所以並查集初始化別忘了0.第二點,這道題的克魯斯卡爾要把所有的邊都遍歷一遍。因為這個圖不一定是連通圖,所以g v,e 最後的邊數可不一定是v 1,而遍歷所有的邊就能克服這個矛盾。第三點,對於...

單源最大權路徑

description 有一棵由n個結點構成的樹,每一條邊上都有其對應的權值。現在給定起點,求從該點出發的一條路徑 至少有一條邊 使得這條路徑上的權值之和最大,並輸出這個最大值。input 第一行乙個正整數t,代表資料組數。每組資料第一行兩個正整數n 2 n 10 5 s 1 s n 分別表示樹結點...