zoukankan      html  css  js  c++  java
  • 食物链POJ1182

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

    2,还是有的东西的吧。

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

    修改前,97lines。

    修改后,56lines。

    近三分之一的行数。。。

    并查集当个模板再看吧。

    void init(int n){
        for(int i=0;i<n;i++){fa[i]=i;rank[i]=0;//不对我这个初始化还跟题目有关的
        }
    }
    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]<rank[y]) fa[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<iostream>
    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;i<n;i++){fa[i]=i;rank[i]=0;
        }
    }
    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]<rank[y]) fa[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<k;i++){cin>>T[i];cin>>X[i];cin>>Y[i];
        } 
        init(n*3);
        for(int i=0;i<k;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<<ans<<endl;
    } 

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

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

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

    害,果然出问题喽,

    日。

    7,费大费小来下!!!

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

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

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

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

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

  • 相关阅读:
    Apicloud_(模板)登陆注册功能模板
    Apicloud_(接口验证)用户注册头部信息X-APICloud-AppKey生成
    Apicloud_(项目)网上书城02_后端数据获取
    Apicloud_(项目)网上书城01_前端搭建
    R_Studio(时序)Apriori算法寻找频繁项集的方法
    R_Studio(聚类)针对iris数据比较几种聚类方法优劣
    R_Studio(神经网络)BP神经网络算法预测销量的高低
    JavaWeb_(SSH论坛)_七、辅助模块
    JavaWeb_(SSH论坛)_六、点赞模块
    JavaWeb_(SSH论坛)_五、帖子模块
  • 原文地址:https://www.cnblogs.com/beiyueya/p/12205417.html
Copyright © 2011-2022 走看看