poj1703

此题考查并查集用辅助数组标记分类 关键点在于路径压缩时候对于叶子节点的处理,理解了就很容易毕竟AC的人很多

if (ans[Father[x]] == true)
ans[x] = !ans[x];

关键点在这句话

#include<iostream>  

#include<fstream>
using namespace std;
int Father[100005];
int Case=0;
bool ans[100005];
int Find(int x)
{
if (Father[x] == x) return x;
int root = Find(Father[x]);
if (ans[Father[x]] == true)
ans[x] = !ans[x];
Father[x] = root;
return root;
}
void Un_tree(int x, int y)
{
int rx = 0, ry = 0;
rx = Find(x);
ry = Find(y);
if (rx == ry)return;
Father[ry] = rx;
ans[ry] = (ans[x]==ans[y])?!ans[ry]: ans[ry];
}
int main()
{
//fstream cin("Text.txt");
cin >> Case;
int n=0, m=0;
int man1, man2;
char C;
  while (Case--)
  {
cin >> n >> m;
for (int i = 1; i < n+1;i++)
{
Father[i] = i;
ans[i] = false;
}
for (int i = 0; i < m;i++)
{
scanf("%s%d%d", &C, &man1, &man2);
if (C=='A')
{
if (n == 2)

cout << "In different gangs." << endl; exit(0); 
}
if (Find(man1) != Find(man2))cout << "Not sure yet." << endl;
else if (ans[man1]==ans[man2])
{
cout << "In the same gang." << endl;

}
else
{
cout << "In different gangs." << endl;
}
}
else
{
Un_tree(man1, man2);
}
}
  }
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值