[Gym-101174K] [Problem K] 判环+ 码力+ 题意

参考https://vjudge.net/solution/7644516

心得:

  1. 这里的 u>=v的限定 ,然后又有 对于边的map映射…
  2. 对于这种的重边的情况,可以这样用map.
  3. 注意当用map 的时候用这个point 的时候会有的错误.
  4. 判环应该更简洁
  5. fst,和ff

然而下面的代码是错的,不想看了

struct point{
    int x,y,z;
    point (int x=0,int y=0,int z=0):x(x),y(y){}
    //point (int x,int y,int z):x(0),y(0),z(0){}
    bool friend operator<(point a,point b){
        return a.x<b.x||(a.x==b.x&&a.y<b.y)||(a.x==b.x&&a.y==b.y&&a.z<b.z);
    }
};
struct point2{
    int x,y;
    point2(int x=0,int y=0):x(x),y(y){}
    //point2(int x,int y):x(0),y(0){}
    bool friend operator <(point2 a,point2 b){
        return a.x<b.x||(a.x==b.x&&a.y<b.y);
    }
};
int n;
map<point,int>mp1;
map<point2,int >mp2;
map<pii,int>f1,f2;
int cnt1,cnt2;
int ok;
int id1(int x,int y,int z){
    if(mp1.count(point(x,y,z))==0){
        mp1[point(x,y,z)]=++cnt1;
    }
    return mp1[point(x,y,z)];
}
int id2(int x,int y){
    if(mp2.count(point2(x,y))==0){
        mp2[point2(x,y)]=++cnt2;
    }
    return mp2[point2(x,y)];
}
int vis[N];
int fst[N<<1],nxt[N<<2],ff[N<<1],vv[N<<2],e;
void dfs1(int u,int p){
    if(vis[u]){
        ok=1;return ;
    }
    vis[u]=1;
    for(int i=fst[u];~i&&!ok;i=nxt[i]){
        int v=vv[i];
        if(v==p)continue;
        dfs1(v,u);
    }
}

void dfs2(int u,int p){
    if(vis[u]){
        ok=1;return;
    }
    vis[u]=1;
    for(int i =ff[u];~i&&!ok;i=nxt[i]){
        int v=vv[i];
        if(v==p)continue;
        dfs2(v,u);
    }
}
void init(){
    mem(fst,-1);
    mem(ff,-1);e=0;
}
void add(int u,int v){
    vv[e]=v;nxt[e]=fst[u];fst[u]=e++;
}
void _add(int u,int v){
    vv[e]=v;nxt[e]=ff[u];ff[u]=e++;
}
int main(){
    ree
    //cin>>n;
    sf("%d",&n);
    init();
    cnt1=0,cnt2=0;
    rep(i,1,n){
        int x,y,z,xx,yy,zz;
        sf("%d%d%d%d%d%d",&x,&y,&z,&xx,&yy,&zz);
        int u=id1(x,y,z),v=id1(xx,yy,zz);
        if(u<v)swap(u,v);
        if(u==v)continue;
        if(f1.count(MP(u,v))==0){
            f1[MP(u,v)]=1;
            add(u,v);add(v,u);
        }

        u=id2(x,y);v=id2(xx,yy);
        if(u<v)swap(u,v);
        if(u==v)continue;
        if(f2.count(MP(u,v))==0){
            f2[MP(u,v)]=1;
            _add(u,v);_add(v,u);
        }
    }
    //cout<<cnt1<<' '<<cnt2<<endl;
        ok=0;
    mem(vis,0);
    for(int i=1;i<=cnt1;++i){
        if(!vis[i]){
            dfs1(i,i);
            if(ok)break;
        }
    }
    if(ok)puts("True closed chains");
    else puts("No true closed chains");
    ok=0;
    mem(vis,0);
    for(int i=1;i<=cnt2;++i){
        if(!vis[i]){
            dfs2(i,i);
            if(ok)break;
        }
    }
    if(ok)puts("Floor closed chains");
    else puts("No floor closed chains");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值