給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...