pku 1182(种类并查集)

题目链接:http://poj.org/problem?id=1182

解题思路来自discuss:http://poj.org/showmessage?message_id=152847

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 50050
int parent[MAXN];
int kind[MAXN];
int n,m,tag; void Initiate()
{
for(int i=;i<=n;i++){
parent[i]=i;
}
memset(kind,,(n+)*sizeof(kind[]));
} int Find(int x)
{
if(x==parent[x]){
return parent[x];
}
int tmp=Find(parent[x]);
kind[x]=(kind[x]+kind[parent[x]])%;
return parent[x]=tmp;
} void Union(int a,int b)
{
int r1=Find(a),r2=Find(b);
parent[r1]=r2;
kind[r1]=(kind[b]-kind[a]++tag-)%;
} int main()
{
// freopen("1.txt","r",stdin);
int a,b,ans=;
scanf("%d%d",&n,&m);
Initiate();
while(m--){
scanf("%d%d%d",&tag,&a,&b);
if(a>n||b>n||(tag==&&a==b)){ ans++;continue; }
if(Find(a)!=Find(b)){
Union(a,b);
}else {
if((kind[a]-kind[b]+)%!=(tag-))
ans++;
}
}
printf("%d\n",ans);
return ;
}
上一篇:POJ1703 Find them Catch them 关于分集合操作的正确性证明 种类并查集


下一篇:为sql server 增加 parseJSON 和 ToJSON 函数