[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.xstruct 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.xint n;
mapint>mp1;
mapint >mp2;
mapint>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(uif(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(uif(u==v)continue;
        if(f2.count(MP(u,v))==0){
            f2[MP(u,v)]=1;
            _add(u,v);_add(v,u);
        }
    }
    //cout<
        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");
}

你可能感兴趣的:(水题)