題意:
有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是...