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

来源:互联网 发布:js的ajax请求 编辑:程序博客网 时间:2024/05/18 01:32

参考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");}
原创粉丝点击