void init(int n)//初始化n个元素
{
for(int i=0;i<n;i++)
{
par[i]=i;
rank[i]=0;
}
}
int find(int x)//查询树的根
{
if(par[x]==x)
{
return x;
}
else
{
return par[x]=find(par[x]);
}
}
void unite(int x,int y)//合并x,y所属的集合
{
x=find(x);
y=find(y);
if(x==y) return ;
if(rank[x]<rank[y])
par[x]=y;
else
par[y]=x;
if(rank[x]==rank[y])
rank[x]++;
}
bool same(int x,int y)//判断x和y是否属于同一集合
{
return find(x)==find(y);
}
食物链问题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=3*5e4+5;
int n,k;
int f[maxn];
int find(int x)
{
if(f[x]==x)
return x;
else
return f[x]=find(f[x]);
}
int unite(int x,int y)
{
int fx=find(x);
int fy=find(y);
f[fx]=fy;
}
int same(int x,int y)
{
return find(x)==find(y);
}
void init()
{
for(int i=0;i<=n*3;i++)
{
f[i]=i;
}
}
int main()
{
int ans=0;
scanf("%d %d",&n,&k);
init();
for(int i=0;i<k;i++)
{
int d,xx,yy;
scanf("%d %d %d",&d,&xx,&yy);
if(xx>n||xx<1||yy<1||yy>n) {ans++;continue;}
else if(d==1)
{
if(same(xx,yy+n)||same(xx,yy+n*2))
{
ans++;
continue;
}
unite(xx,yy);
unite(xx+n,yy+n);
unite(xx+n*2,yy+n*2);
}
else
{
if(same(xx,yy)||same(xx,yy+n*2))
{
ans++;
continue;
}
unite(xx,yy+n);
unite(xx+n,yy+n*2);
unite(xx+n*2,yy);
}
}
cout<<ans<<endl;
return 0;
}
HDU5326 主要是二维数组vis的设置
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=2*1e2+5;
int n,k;
int f[maxn];
int vis[maxn][maxn];
int num[maxn];
int find(int x)
{
while(x!=f[x]) x=f[x];
return f[x];
}
int unite(int x,int y)
{
int fx=find(x);
int fy=find(y);
f[fx]=fy;
}
int same(int x,int y)
{
return find(x)==find(y);
}
void init()
{
for(int i=1;i<=n;i++)
{
f[i]=i;
num[i]=0;
}
}
int main()
{
int a,b;
int m,k,ans;
while(cin>>n>>k)
{
m=n-1;
memset(vis,0,sizeof(vis));
init();
while(m--)
{
cin>>a>>b;
if(find(a)!=find(b))
unite(b,a);
vis[a][b]=1;
}
//如果b管理c,a又管理b,那么a也管理c
for(int t=1;t<=n;t++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
if(vis[i][t]==1&&vis[t][j]==1)
vis[i][j]=1;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(f[i]==f[j]&&i!=j&&vis[i][j]==1)
num[i]++;
}
}
ans=0;
for(int i=1;i<=n;i++)
{
if(num[i]==k) ans++;
}
printf("%d\n",ans);
}
return 0;
}