poj 1182 並查集 食物鏈類

2021-07-03 03:36:25 字數 1877 閱讀 9692

題意:

有n只動物,分別編號1....n。所有動物都屬於a,b,c中的一種,已知a吃b,b吃c,c吃a。

按順序給出下面兩種共k條資訊:

1. x 和 y 屬於同一類。

2. x 吃 y 。

然而這些資訊可能會出錯,有可能有的資訊和之前給出的資訊矛盾,也有的資訊可能給出的 x 和 y 不在n的範圍內。

求k條資訊中有多少條是不正確的。

解析:對於每只動物,建立3個元素 i - a, i - b, i - c,用這 3 * n個元素建立並查集。

i - x 表示 「i屬於種類x」;

並查集裡面的每乙個組(連通區域)表示組內所有元素代表的情況都同時發生或者同時不發生。

所以,第一種資訊:x和y屬於同一類,合併 x - a, y - a、 x - b,y - b,x - c,y - c,就行了。

對於第二種資訊:x 吃 y , 只要合併 x - a,y - b, x - b,y - c, x - c, y - a,就行了。

**:(加rank,,,慢了一點)

#include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define lson lo, mi, rt << 1

#define rson mi + 1, hi, rt << 1 | 1

using namespace std;

const int inf = 0x3f3f3f3f;

const int maxn = 50000 * 3 + 10;

const double eps = 1e-9;

int fa[maxn];

int rank[maxn];

void init(int n)

}int find(int x)

void union(int u, int v)

else

}bool same(int u, int v)

int main()

if (op == 1)

else

}else///op == 2

else}}

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

return 0;

}

不加rank,快了餓一點:

#include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define lson lo, mi, rt << 1

#define rson mi + 1, hi, rt << 1 | 1

using namespace std;

const int inf = 0x3f3f3f3f;

const int maxn = 50000 * 3 + 10;

const double eps = 1e-9;

int fa[maxn];

void init(int n)

}int find(int x)

void union(int u, int v)

}bool same(int u, int v)

int main()

if (op == 1)

else

}else///op == 2

else}}

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

return 0;

}

POJ 1182 食物鏈 並查集

此題利用並查集解決。對於每只動物i建立3個元素i a,i b,i c,並用這3 n個元素建立並查集。1 i x表示 i屬於種類x 2 並查集你的每一組表示組內所有元素代表的情況同時發生或不發生。對於每一條資訊,只需要按照下列操作即可 1.第一種 x,y同類,合併x a和y a x b和y b x c...

POJ 1182 食物鏈 (並查集)

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

POJ 1182 食物鏈(並查集)

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