食物链POJ1182

1,有答案咱就先看看省时间。毕竟以后没答案的题目多的是。

2,还是有的东西的吧。

3,我先把这代码风格修改下,太长了,

修改前,97lines。

修改后,56lines。

近三分之一的行数。。。

并查集当个模板再看吧。

void init(int n){
    for(int i=0;i0;//不对我这个初始化还跟题目有关的
    }
}
int find(int x){
    if(fa[x]==x) return x;
    else return fa[x]=find(fa[x]);
}
void unite(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y) return ;
    
    if(rank[x]y;
    else{fa[y]=x;
        if(rank[x]==rank[y]) rank[x]++;
    }
    
}
bool same(int x,int y) return find(x)==find(y);你这样还不行的!

bool same(int x,int y)
{
return find(x)==find(y);}

 

4,懂了一点,但是不是很清晰。

#include
using namespace std;
int n,k,T[1005],X[1005],Y[1005];
int fa[1005],rank[1005];
int ans=0;
void init(int n){
    for(int i=0;i0;
    }
}
int find(int x){
    if(fa[x]==x) return x;
    else return fa[x]=find(fa[x]);
}
void unite(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y) return ;
    
    if(rank[x]y;
    else{fa[y]=x;
        if(rank[x]==rank[y]) rank[x]++;
    }
    
}
bool same(int x,int y) 
{
return find(x)==find(y);
}
int main(){
    cin>>n>>k;
    for(int i=0;i>T[i];cin>>X[i];cin>>Y[i];
    } 
    init(n*3);
    for(int i=0;i){
        int t=T[i];
        int x=X[i]-1;
        int y=Y[i]-1;
        //变成了0到n-1的范围
        if(x<0||x>=n||y<0||y>=n){ans++;
            continue;} 
        if(t==1){
            if(same(x,y+n)||same(x,y+2*n)) ans++;
            else{
                unite(x,y);
                unite(x+n,y+n);
                unite(x+n*2,y+n*2); }
        }
        else{
            if(same(x,y)||same(x,y+2*n)) ans++;
            else{
                unite(x,y+n);
                unite(x+n,y+2*n);
                unite(x+2*n,y);
            }    
        }
    }
    cout<endl;
} 

5,不是很难懂,但是思想都很好。

直接错误的话,没有continue问题比较大。

6,顺便把并查集复习下也好,

害,果然出问题喽,

日。

7,费大费小来下!!!

费大??其实人家也讲的很好了。是维护动物之间的关系。。而且因为N,K很大的情况下,你还得高效地维护这些东西。

并且人家也说了用并查集,同时并查集不就是高效地维护各种各样的关系么。但是但是,

并查集是维护同一组的数据结构。但是这个,我来给你想想。。。有个什么ABC的关系,但是还跟数字啥的关系比较大。除了什么同一类,还有捕食关系存在。

难啊难,我费大不出来我给你直说吧。

我敲~~~~~~~我敲!!!!!

你可能感兴趣的:(食物链POJ1182)