每组数据第一行为两个整数,分别是n和m:
n为蝴蝶的数量,编号从0到n-1
m为关系的数量
接下来是m组关系数据,每组数据占一行,为三个整数,前两个整数表示蝴蝶的编号,第三个整数为关系的种类(相同或者不同):
0为相同,1为不同
1 < n <= 1000
1 < m <= 100000
不合理就输出NO
3 3 0 1 0 1 2 1 0 2 1 3 3 0 1 0 1 2 1 0 2 0
YES NO
注意关系如何更新:
# include<iostream>
using namespace std;
# define N 1005
struct NODE
{
int p,r;//0表示与父亲同类,1表示不同
};
NODE node[N];
void MakeSet(int n)
{
for(int i=0;i<n;i++)
{
node[i].p=i;
node[i].r=0;
}
}
int FindParent(int i)
{
if(i==node[i].p)
{
return i;
}
else
{
int ip=node[i].p;
node[i].p=FindParent(ip);
node[i].r= node[i].r==node[ip].r? 0:1;
return node[i].p;
}
}
int main()
{
int n,m,i,j,k,a,b,ap,bp;
bool bug;
while(cin>>n>>m)
{
MakeSet(n);
bug=false;
for(i=1;i<=m;i++)
{
cin>>a>>b>>k;
ap=FindParent(a);
bp=FindParent(b);
if(ap==bp)
{
if( (k==0&&node[a].r!=node[b].r) || (k==1&&node[a].r==node[b].r) )
{
bug=true;
}
}
else //union
{
node[bp].p=ap;
if(k==0)
{
node[bp].r= node[a].r==node[b].r? 0:1;
}
else
{
node[bp].r= node[a].r==node[b].r? 1:0;
}
}
}
if(bug)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
}
return 0;
}
本文介绍了一种用于判断蝴蝶间关系是否合理的算法。该算法通过并查集数据结构处理多个蝴蝶之间的相同或不同关系,并最终输出这些关系是否合理。输入包括蝴蝶数量及它们之间的关系数据,输出则依据关系合理性给出YES或NO。
1879

被折叠的 条评论
为什么被折叠?



