| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:在《挑战程序设计竞赛》中看到了一种新的解法,于是理解后写下来,欢迎各位也把自己的理解感悟分享一下In Reply To:Re:在《挑战程序设计竞赛》中看到了一种新的解法,于是理解后写下来,欢迎各位也把自己的理解感悟分享一下 Posted by:201501060326 at 2016-02-21 20:58:57 #include <stdio.h>
int p[150000];
int find(int x)//find函数功能为找到与x相关联的第一个输入项,比如可能有很多个输入是同
{ //类或有间接捕食关系,可以找到所有关联项的第一个,把所有输入都逻辑串联
if(p[x]==x)
return x;
else
return p[x]=find(p[x]);
}
int same(int x,int y)//判断x,y是否为同类
{
if(find(x)==find(y))
return 1;
else
return 0;
}
int unite(int x,int y)//与find函数密切关联,将x,y逻辑关系串联
{
int u,v;
u=find(x);
v=find(y);
if(u!=v) p[u]=v;//将x,y串联的关键
}
int main()
{
int i,n,k,d,x,y,err=0;
scanf("%d%d",&n,&k);
for(i=1; i<=3*n; i++) p[i]=i;//x表示x为A种动物,x+n表示x为B种动物,x+2*n表示
while(k--) //x为C种动物
{
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n) err++;
else if(d==1)
{
if(same(x,y+n)==1||same(x,y+2*n)==1) err++;//互为同类,不可捕食
else
{
unite(x,y);
unite(x+n,y+n);
unite(x+2*n,y+2*n);//合并所有同类关系的可能
}
}
else
{
if(same(x,y)==1||same(x,y+2*n)==1) err++;//捕食关系不可为同类或相反
else
{
unite(x,y+n);
unite(x+n,y+2*n);
unite(x+2*n,y);//合并所有捕食关系的可能
}
}
}
printf("%d\n",err);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator