題目大意:一共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 分別表示樹結點...