並查集在實際問題中的應用

2021-08-22 05:00:11 字數 1057 閱讀 6092

並查集:用以將元素高效分組以及區分。

原問題如下,在乙個(n*m)的table上,element會做出一種增值行為,如果有三個物質處於某個矩形的三個頂點上,那麼在第四個頂點上會自動增值出乙個element。現在table上已經存在了一些物質,求出最少仍需多少額外的物質,使得其可以將table覆蓋。

對於解這道題來說,靈活的轉化思想非常重要。首先我們可以證明,如果乙個矩形有兩條相鄰的邊被覆蓋滿,這個矩形就可以通過增值自行覆蓋。進一步我們可以發現,如果將這兩條邊按垂直方向「打散」之後分散在矩形中,依然可以完成增值。

這個性質的本質是什麼呢,可以將存在三個點(r1,c1),(r1,c2),(r2,c1),看作在(r1,c1),(r1,c2),(r2,c1)三對值之間存在聯絡,因而r2和c2也發生了聯絡,於是點(r2,c2)也隨之存在,因此可以用並查集來解決問題,全集即為(r1,r2……rn,c1,c2……cn)。

每輸入乙個點,即將對應兩個值unite起來;輸入完畢後,會出現若干集合。這些集合內部的橫縱座標值自由組合形成的點就是已存在的;而集合之間所能組合形成的點都是尚未塗色的。最終我們希望達到的效果是,所有值都處在乙個集合裡,這樣不論考查哪個點,它的橫縱座標一定是聯絡起來的。因此我們額外塗點的作用實際上,是將不同集合聯絡起來,因此結果等於集合數-1

附ac**

#include#includeusing namespace std;

int p[400010],r[400010];

int fa(int ch)

void unite(int u,int v)

else if(r[fu]>n>>m>>q;

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

p[i]=i;

for(int i=0; iint ans=0;

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

if(p[i]==i)

ans++;

cout

}

實際問題中的 if else 語句應用

完 楊建和 完成日期 2011 年 10 月 26 日 版 本號 對任務及求解方法的描述部分 輸入描述 個人月收入總額 問題描述 從2011年9月1日起,我國調整個人所得稅起徵點。基數上調為3500元,超出部分按以下7級計算。1 超過0至1500 稅率3 速算扣除數0 2 超過1500元至4500元...

並查集的應用(島問題)

題意描述 乙個矩陣中只有0和1兩種值,每個位置都可以和自己的上 下 左 右四個位置相連,如果有一片1連在一起,這個部分叫做乙個島,求乙個矩陣中有多少個島?舉例 1,1,0,1 1,0,1,0 0,1,1,1 共有三個島。解決方案 常規解法 我們可以設計乙個感染函式,該函式的功能是如果當前位置是1,那...

實際應用問題中的最值

2019屆高三理科數學三輪模擬試題 某蓮藕種植塘每年的固定成本是 1 萬元,每年最大規模的種植量是 8 萬斤,每種植一斤藕,成本增加 0.5 元,如果銷售額函式是 f x cfracx 3 cfracax 2 cfracx x 是蓮藕種植量,單位 萬斤 銷售額的單位 萬元,a 是常數 若種植 2 萬...