並查集 牛客練習賽41 C抓捕盜竊犯

2022-03-11 14:31:30 字數 1115 閱讀 6801

題目鏈結 :

題意,初始每乙個城市都有一夥盜賊,沒過乙個時刻盜賊就會逃竄到另乙個城市,你可以在m個城市設定監察站,會逮捕所有經過該城市的盜賊

分析:仔細分細題目,因為每個城市的盜賊都是流動的,這就可能會形成環,而如果成環的話,在環所在任一城市都可以把這批城市的全部盜賊逮捕,就不需要再環上設多個監察站了,進一步推廣,因為可以自己往自己的城市跑,所以也有可能是鏈,而鏈也是滿足設乙個監察站可以逮捕所有

自然想到引入並查集,用map來儲存

1 #include 2

using

namespace

std;

3 typedef long

long

ll;4

const

int maxn=1e5+7;5

const

int mod=1e9+7;6

ll a[maxn],v[maxn];

7ll par[maxn];

8ll rnk[maxn];

9ll c[maxn];

10bool cmp(const ll &a,const ll &b)

13void

init()

16ll find(ll x)

20else23}

24void

unite(ll x,ll y)else33}

34bool

same(ll x,ll y)

37int

main()

43for(int i=1;i<=n;i++)

47 mapans;

48 map::iterator ite;

49for(ll i=1;i<=n;i++)

52//

for(int i=1;i<=n;i++) cout<53

int j=0;54

for(ite=ans.begin();ite!=ans.end();++ite)

57 sort(c,c+ans.size(),cmp);

58 ll cnt=0;59

for(ll i=0;i)//

cout<61 cout62return0;

63 }

牛客練習賽41 C 抓捕盜竊犯(並查集)

題解 這個題中逃犯是可以連續移動的,而不是移動到乙個位置後停止,所以用並查集find函式將每個點的最開始的那個點作為父親,然後求屬於此節點的總和,最後排序找出前m大。include include include include using namespace std int n,m,x int p...

牛客練習賽41

相當於求n個點,已知n條邊,組成各個連通分塊,每個連通分塊有乙個和值,求出最大的幾個和值。用並查集給邊建立聯絡,計算連通塊和是 先找到那個fa點 再給該點加值。include include include include include includeusing namespace std typ...

牛客練習賽 41

a.博弈 我們發現 要麼一次拿光,要麼 m 為 1 否則都贏不了 b.dp 思路,因為有負數,如果全負數,最小為 666 300 近似於 21w 所以把錨點設為 210000,dp i j 代表 前 i 個數字 湊夠數字 j 的方案數,dp i j dp i 1 j dp i 1 j a i 但是 ...