您的位置:首页 > 其它

[bzoj3953] [WF2013]Self-Assembly

2016-07-05 20:07 344 查看
  将正方形视为连接字符间的边。比方说正方形上存在A+,B-,就从A-往B+连边,表示字符可以通过这个正方形进行变换。

  如果能构成环的话就可以无穷大了。。。判环随便写个拓扑什么的...

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
#define ull unsigned long long
#define d double
using namespace std;
bool mp[55][55];
int dl[233],rd[233];;
int i,j,k,n,m,l,r;
char s[23];

int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=0,fh=1;
while((rx<'0'||rx>'9')&&rx!='-')rx=getchar();
if(rx=='-')fh=-1,rx=getchar();
while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;
}
int main(){
n=read();int a[5];
for(i=1;i<=n;i++){
scanf("%s",s+1);
for(j=1;j<=4;j++)if(s[j<<1]!='0')
a[j]=(s[j*2-1]-'A'+1)*2+(s[j<<1]=='-');else a[j]=-233;
//      for(j=1;j<=4;j++)printf("    %d",a[j]);puts("");
for(j=1;j<4;j++)if(a[j]>0)for(k=j+1;k<=4;k++)if(a[k]>0)
//          printf("    %d-->%d\n  %d-->%d\n",a[j]^1,a[k],a[k]^1,a[j]),
mp[a[j]^1][a[k]]=mp[a[k]^1][a[j]]=1;
//      printf("(%d)",i);
}
for(i=2;i<=53;i++){
for(j=2;j<=53;j++)if(mp[j][i])rd[i]++;
if(!rd[i])dl[++r]=i;
}
while(l<r)
for(int now=dl[++l],i=2;i<=53;i++)if(mp[now][i]&&!--rd[i])
dl[++r]=i;
if(r==52)puts("bounded");else puts("unbounded");
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: