POJ 1182 解题报告--【附】注释对oj的影响

该题的解题关键是:
1、将解题的主要流程画出来:
如果d==1,那么 如果find(x)==find(y) ,则:
                         else: union()
如果d==2,那么,如果find(x)==find(y),则:判断
                         else:union()
2、判断的时候,如果d==1,那么只要relation(x)==relation(y),即可
                           如果d==2, 那么需要一个关系式来判定:
                                                        A
                                                  x          y
                           首先,因为x,与 y的关系已经有输入确定了,x吃y,那么 ,x与A的关系,y与A的关系也定了,因此,找个式子判断这三个关系组合在一起成立不成立就可以了。呵呵,貌似很简单,可是在想这道题目的时候是多么的抓狂!relation[x]==(relation[y]+1)%3,这样,输入才正确。
附注:如果题目中没有注释,可以减少运行的时间,看图:呵呵





#include <iostream>
//#include <string.h>
//#include <stdlib.h>
//#include <time.h>
using namespace std;
int num;
int parent[50001];
int rel[50001];
//int check[100000];
int digui(int x);
int find(int x)
{
int a=x;
while(parent[a]!=a)
   a=parent[a];
//将x保存
// int z=x;
while(parent[x]!=x)
{
   int temp=parent[x];
   rel[x]=digui(x);
   parent[x]=a;
   x=temp;
}
return a;
}
int digui(int x)
{
if(parent[x]==x)
return 0;
else
return ((rel[x]+digui(parent[x]))%3);
}
void unionrel(int a,int b,int d)
{
int x=find(a);
int y=find(b);
parent[x]=y;
rel[x]=((3-rel[a]+d+rel[b]))%3;
/*
细节决定成败:
这里:最开始我写为:
parent[a]=b;//这个显然是错误的,应该是a的根节点指向b的根节点,即:parent[find(a)]=find[b]
rel[a]= ((3-rel[a]+d+rel[b]))%3;//把rel[a]重新定义为:((3-rel[a]+d+rel[b]))%3 这也是不对的,应该是rel[parent[a]]
*/
}
int main()
{
// clock_t start=clock();
// memset(check,0,sizeof(check));
int m,n;
// cin>>m>>n;//m:动物的个数 n:n种关系
scanf("%d%d",&m,&n);
// FILE *fp;
// fp=fopen("input.in","r");
// fscanf(fp,"%d%d",&m,&n);
int i=0;
for(i=1;i<=m;i++)
{
   parent[i]=i;
   rel[i]=0;
}
for(i=1;i<=n;i++)
{//开始接受n条关系了
   int d,x,y;
   scanf("%d%d%d",&d,&x,&y);
// cin>>d>>x>>y;//2 1 2
// fscanf(fp,"%d%d%d",&d,&x,&y);
   if(x>m||y>m)
   {
   
    num++;
//   check[i]=1;
    continue;
   }
  
   if(d==2&&x==y)
   {
    num++;
//   check[i]=1;
    continue;
   }

   if(d==1)
   {//同类动物
    if(find(x)==find(y))
    {
     if(rel[x]!=rel[y])
     {
      num++;
//     check[i]=1;
     // continue;
     }
    
    }
    else
    {
     unionrel(x,y,0);//将x,y建立为同一种关系
    }
   
   }
   else //if(d==2)
   {
    if(find(x)==find(y))
    {
     if(rel[x]!=(rel[y]+1)%3)
     {
      num++;
//     check[i]=1;
     // continue;
     }
    
    }
    else
    {
     unionrel(x,y,1);//将x,y建立为敌人关系
    }
   
   }    
}
cout<<num<<endl;
// cout<<"谎话总数"<<num<<endl;
// int test=1;
/*
while(test<=i)
{
   if(check[test]!=0)
   cout<<"第"<<test<<"条"<<endl;
   test++;
}
*/
// cout<<clock()-start<<endl;
// system("PAUSE");
return 0;
}

评论

此博客中的热门博文

Linux/ARM Page Table Entry 属性设置分析

由RFE指令引发的一串故事

提交了30次才AC ---【附】POJ 2488解题报告