本文共 1559 字,大约阅读时间需要 5 分钟。
团伙管理系统的解决方案
题意:给你t组数据,每组数据中有编号为1-n的坏人,这些坏人要么属于团伙A,要么属于团伙B。系统需要处理m次操作,具体操作包括:
这个问题类似于POJ 1182 食物链问题,解决思路也是基于并查集(Union-Find)数据结构。并查集能够高效地管理动态的集合关系,支持快速的合并和查找操作。
#include#include #include using namespace std;const int MAX_N = 200005;int t, n, m, fa[MAX_N], opp[MAX_N];char op;int x, y;int find(int x) { if (x == fa[x]) return x; else return fa[x] = find(fa[x]);}void unite(int x, int y) { x = find(x); y = find(y); if (x == y) return; fa[x] = y;}bool same(int x, int y) { return find(x) == find(y);}void init() { for (int i = 1; i <= n * 2; ++i) fa[i] = i;}void solve() { while (m--) { scanf("%s%d%d", op.c_str(), &x, &y); if (op == 'A') { if (same(x, y)) puts("In the same gang."); else if (same(x, y + n)) puts("In different gangs."); else puts("Not sure yet."); } else { unite(x, y + n); unite(x + n, y); } }}int main() { scanf("%d", &t); while (t--) { scanf("%d%d", &n, &m); init(); solve(); } return 0;}
init()函数初始化并查集数组fa,每个元素初始指向自己。find()函数用于路径压缩,找到元素的根节点。unite()函数用于合并两个集合,采用按秩合并的方式。same()函数判断两个元素是否属于同一个集合。solve()函数中,循环处理每个操作。对于'A'操作,检查x和y是否在同一集合中;对于'D'操作,强制合并两个集合。main()函数处理输入输出,逐组处理数据。通过上述解决方案,可以有效地管理团伙成员的归属关系,快速响应操作请求。
转载地址:http://xuxfk.baihongyu.com/