poj1182 維護並查集裡更複雜的關係

2021-07-10 12:04:09 字數 2469 閱讀 2375

題意:有n只動物,1~n,每只動物只能屬於a,b,c三類中的一類,a,b,c 滿足 a吃b,b吃c,c吃a,的關係。

給出兩種型別的關係,問那些是假的。

第一種,1,x,y 表示x,y 屬於一種型別的動物

第二種 ,2,x,y 表示x吃y。

假的 資訊有三種情況:

1.x,y>n

2. 關係2 時,x與y相等

3. 和前面的話衝突

思路:由於並查集只能反應屬於同一集合的關係,而本題不只有屬於同一類,有三類情況,這裡我們就要思考,怎麼樣連線他們的關係能達到檢驗三種關係,並且可以傳遞。

這裡技巧是:

對於每只動物i建立3個元素i-a, i-b, i-c, 並用這3*n個元素建立並查集。這個並查集維護如下資訊:

① i-x 表示 「i屬於種類x」。

②並查集裡的每乙個組表示組內所有元素代表的情況都同時發生或不發生。

例如,如果i-a和j-b在同乙個組裡,就表示如果i屬於種類a那麼j一定屬於種類b,如果j屬於種類b那麼i一定屬於種類a。因此,對於每一條資訊,只需要按照下面進行操作就可以了。

1)第一種,x和y屬於同一種類———合併x-a和y-a、x-b和y-b、x-c和y-c。

2)第二種,x吃y—————————合併x-a和y-b、x-b和y-c、x-c和y-a。

不過在合併之前需要先判斷合併是否會產生矛盾。例如在第一種資訊的情況下,需要檢查比如x-a和y-b或者y-c是否在同一組等資訊。

為什麼這樣可行了,我覺得首先這樣的組合正好可以區分三種類別,最重要他們關係還可以傳遞,沒有被破壞,當然就行(自行忽略我的解釋…).實在迷糊,你可以舉個例試試,就可以發現其中技巧。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define rep(i,a,n) for (int i=a;i#define per(i,a,n) for (int i=n-1;i>=a;i--)

#define pb push_back

#define mp make_pair

#define all(x) (x).begin(),(x).end()

#define fi first

#define se second

#define eps 1e-8

#define m_pi 3.141592653589793

typedef

long

long ll;

const ll mod=1000000007;

const

int inf=0x7fffffff;

ll powmod(ll a,ll b) return res;}

using

namespace

std;

const

int n=2000;

int f[n*2+10],n,m;

void init()

int find(int x)

void merge(int x,int y)

int main()

else

}if(flag) printf("scenario #%d:\nsuspicious bugs found!\n\n",++t);

else

printf("scenario #%d:\nno suspicious bugs found!\n\n",++t);

}}

#include

#include

using

namespace

std;

const

int n=50000;

int f[n+10],rak[n+10];

void init()

memset(rak,0,sizeof(rak));

}int find(int x)

return f[x];

}bool merge(int x,int y,int t)

f[ty]=tx;

rak[ty]=(rak[x]-rak[y]+t+3)%3;

return

false;

}int main()

if(merge(a,b,d-1)) ans++;

}printf("%d\n",ans);

}

發現同樣型別的題目還有 poj1703 hdu1829 當然我用的都是《挑戰》上技巧ac..

poj 1182 帶權並查集

description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示x和y是...

poj1182 帶權並查集

題意 中文題就不描述了 思路 帶權並查集模板題 加入乙個陣列 表示這個點和它父節點的關係 表示同類,表示父親吃它,表示它吃父親 每次需要更新和父親之間的關係 include includeconst int n 50005 int p n r n n,k void init int x int fi...

POJ 1182 帶權並查集

食物鏈 time limit 1000ms memory limit 10000k total submissions 89563 accepted 26905 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n...