您的位置:首页 > 其它

poj 1182 深入并查集

2015-08-11 15:04 363 查看
#include <stdio.h>
#include <string.h>
#include <algorithm>
#pragma warning (disable : 4996)
using namespace std;

const int Max = 50005;
int Father[Max], Rank[Max], n;

void Init()
{
for (int i = 0; i <= n; i++)
Father[i] = i;
memset(Rank, 0, sizeof(Rank));
}

int Find(int x)
{
if (x != Father[x])
{
int fx = Find(Father[x]);
Rank[x] = (Rank[x] + Rank[Father[x]]) % 3;
Father[x] = fx;
}
return Father[x];
}

bool Union(int x, int y, int k)
{
int fx = Find(x);
int fy = Find(y);
if (fx == fy)
{
if ((Rank[y] - Rank[x] + 3) % 3 != k)return true;
return false;
}
Father[fy] = fx;
Rank[fy] = (Rank[x] - Rank[y] + k + 3) % 3;
return false;
}

int main()
{
int k, x, y, d;
scanf("%d %d", &n, &k);
int sum = 0;
Init();
while (k--)
{
scanf("%d %d %d", &d, &x, &y);
if (x > n || y > n || (x == y&&d == 2))
sum++;
else if (Union(x, y, d - 1))
sum++;
}
printf("%d\n", sum);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: