标签:正整数 b2b main union outline bre microsoft strong com
Description
Input
Output
Sample Input
100 7 1 101 1 2 1 2 2 2 3 2 3 3 1 1 3 2 3 1 1 5 5
Sample Output
3
解题思路:这道题要我们得出假话的数目,如果这就话和之前的话冲突就是假话。我开始没有什么思路,看了看样例,随手画出了图,感觉像是图论的东西,但其实再仔细想想,其实这是一种状态的划分!!!比如说a和b是同类关系,那就把a和b划分到一个集合中,之后再说a和b是捕食关系一定是假话了。但是这道题的问题在于某一个动物在食物链中的角色不是一定的,一个物种可能作为捕食者也可能是被捕食者,还有可能给出同类之间的关系,那该怎么办呢?将所扮演的三种状态全都表示出来。列如,对于物种x,x代表A类,x+n代表B类,x+2n代表c类,其中A吃B,B吃C,C吃A。
对于两个动物如果是同类关系,那么一定不存在捕食和被捕食关系;如果存在捕食关系,那么一定不存在被捕食和同类关系。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define MAX 50010*3 5 using namespace std; 6 int pre[MAX]; 7 int Find(int x) 8 { 9 int a; 10 a=x; 11 while(pre[a]!=a) 12 { 13 a=pre[a]; 14 } 15 return a; 16 } 17 void Union(int root1,int root2) 18 { 19 int x,y; 20 x=Find(root1); 21 y=Find(root2); 22 if(x!=y) 23 { 24 pre[x]=y; 25 } 26 } 27 int Same(int x,int y)///判断两个物种是否有关系 28 { 29 return Find(x)==Find(y); 30 } 31 int main() 32 { 33 int n,m,i,counts; 34 int a,b,q; 35 scanf("%d%d",&n,&m); 36 counts=0; 37 for(i=1;i<=n*3;i++) 38 { 39 pre[i]=i; 40 } 41 for(i=1;i<=m;i++) 42 { 43 scanf("%d%d%d",&q,&a,&b); 44 if(a<1||a>n||b<1||b>n) 45 { 46 counts++; 47 continue; 48 } 49 if(q==1) 50 { 51 if(Same(a,b+n)||Same(a,b+2*n))///存在捕食关系或者被捕食关系 52 { 53 counts++; 54 } 55 else///建立同类关系 56 { 57 Union(a,b); 58 Union(a+n,b+n); 59 Union(a+2*n,b+2*n); 60 } 61 } 62 else if(q==2) 63 { 64 if(Same(a,b)||Same(a,b+2*n))///存在同类或者被捕食关系 65 { 66 counts++; 67 } 68 else///建立所有的捕食关系 69 { 70 Union(a,b+n); 71 Union(a+n,b+2*n); 72 Union(a+2*n,b); 73 } 74 } 75 } 76 printf("%d\n",counts); 77 return 0; 78 }
标签:正整数 b2b main union outline bre microsoft strong com
原文地址:https://www.cnblogs.com/wkfvawl/p/9726554.html