您的位置:首页 > 其它

POJ 1182 食物链

2015-08-17 13:27 302 查看
题意就不讲解了,很经典的一道题目,这是链接:<span style="font-family: Arial, Helvetica, sans-serif;">http://poj.org/problem?id=1182</span>



题解:利用并查集,注意考虑合并时的关系更新


</pre><pre name="code" class="cpp">#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#define INF 0x3f3f3f3f
#define maxn 50010
using namespace std;
int parent[50010], relation[50010]; //parent[x]是x的父节点 relation[x]是x与根节点的关系
int N, K, X, Y, D, ans = 0;

void init()
{
for(int i = 0; i < N; i++)
{
parent[i] = i;
relation[i] = 0;
}
}                              //初始化数组

int find(int x)
{
if(x != parent[x])
{
int temp = parent[x];
parent[x] = find(temp);                     //必须先从父节点更新
relation[x] = (relation[x] + relation[temp]) % 3; //不断更新当前节点与根节点关系
}
return parent[x];
}                          //寻找x的根节点

void Union()
{
int px = find(X);
int py = find(Y);
parent[py] = px;
relation[py] = (D - 1 + 3 - relation[Y] + relation[X]); //更新Y根节点与总的根节点关系
}                                              //合并X,Y

int main()
{
scanf("%d%d", &N, &K);
init();
while(K--)
{
scanf("%d%d%d", &D, &X, &Y);
if(X > N || Y > N)
ans++;
else if(D == 2 && X == Y)
ans++;
else
{
if(find(X) == find(Y))
{
if((3 - relation[X] + relation[Y]) % 3 != D - 1) //3-部分是X与根节点关系   relation[Y]是根节点与X关系  加起来就是X与Y关系
ans++;
}
else
Union();
}
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: