51Nod 1515 明辨是非

2021-07-25 03:40:39 字數 1019 閱讀 4269

給n組操作,每組操作形式為x y p。

當p為1時,如果第x變數和第y個變數可以相等,則輸出yes,並限制他們相等;否則輸出no,並忽略此次操作。

當p為0時,如果第x變數和第y個變數可以不相等,則輸出yes,並限制他們不相等 ;否則輸出no,並忽略此次操作。

這是一道很經典的題目。

如果只有強制相同集合的話,那麼這題是很簡單的。

但是,強制不相等的情況怎麼辦?

我們考慮一下資料結構:

如果要強制x和y不在同乙個集合裡面,我們維護乙個x的集合(用set維護),裡面存的是與x不在同乙個集合的數,但是因為要用到並查集合並,所以集合裡存的是x在並查集樹上的根(getfather(x))

詢問k,l,x=getfather(k),y=getfather(l)

那麼當p=0的時候,如果兩個數在同一棵並查集中的話,那麼肯定是no了,否則是yes,然後更新一下x的集合和y的集合,以此來強制兩個數不在用乙個集合。

如果p=1的情況,那麼如果x=y那麼直接yes,如果x的集合裡面有y的話,那麼說明x和y之前強制不在乙個集合,那麼就是no。然後x和y的集合(set)就需要按秩合併了,如果x.size()

#include

#include

#include

#include

#include

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

using

namespace

std;

const

int maxn=100007;

int i,j,k,l,t,n,m,ans,tot,x,y,f[maxn];

seta[maxn];

mapb;

int gf(int x)

int main()

}else

}else

printf("yes\n");}}

}

51nod1515明辨是非

1515 明辨是非 基準時間限制 1 秒 空間限制 131072 kb 分值 160 難度 6級 給n組操作,每組操作形式為x y p。當p為1時,如果第x變數和第y個變數可以相等,則輸出yes,並限制他們相等 否則輸出no,並忽略此次操作。當p為0時,如果第x變數和第y個變數可以不相等,則輸出ye...

51nod 1515 明辨是非

給n組操作,每組操作形式為x y p。當p為1時,如果第x變數和第y個變數可以相等,則輸出yes,並限制他們相等 否則輸出no,並忽略此次操作。當p為0時,如果第x變數和第y個變數可以不相等,則輸出yes,並限制他們不相等 否則輸出no,並忽略此次操作。輸入乙個數n表示操作的次數 n 1 10 5 ...

明辨是非 51Nod 1515

注意這題跟種類並查集不沾邊 因為a b b c推不出a c 對於每個集合u 把所有與u不等的集合v1 v2.都存入乙個vector 在合併u與v時 對其中vector元素較少的乙個進行遍歷 判斷是否包含另乙個集合 即啟發式合併 include include include include usin...