参考https://vjudge.net/solution/7644516
心得:
- 这里的 u>=v的限定 ,然后又有 对于边的map映射…
- 对于这种的重边的情况,可以这样用map.
- 注意当用map 的时候用这个point 的时候会有的错误.
- 判环应该更简洁
- 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");
}