[bzoj3953] [WF2013]Self-Assembly

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

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

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define ll long long
 6 #define ull unsigned long long
 7 #define d double
 8 using namespace std;
 9 bool mp[55][55];
10 int dl[233],rd[233];;
11 int i,j,k,n,m,l,r;
12 char s[23];
13  
14 int ra,fh;char rx;
15 inline int read(){
16     rx=getchar(),ra=0,fh=1;
17     while((rx<'0'||rx>'9')&&rx!='-')rx=getchar();
18     if(rx=='-')fh=-1,rx=getchar();
19     while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;
20 }
21 int main(){
22     n=read();int a[5];
23     for(i=1;i<=n;i++){
24         scanf("%s",s+1);
25         for(j=1;j<=4;j++)if(s[j<<1]!='0')
26             a[j]=(s[j*2-1]-'A'+1)*2+(s[j<<1]=='-');else a[j]=-233;
27 //      for(j=1;j<=4;j++)printf("    %d",a[j]);puts("");
28         for(j=1;j<4;j++)if(a[j]>0)for(k=j+1;k<=4;k++)if(a[k]>0)
29 //          printf("    %d-->%d\n  %d-->%d\n",a[j]^1,a[k],a[k]^1,a[j]),
30             mp[a[j]^1][a[k]]=mp[a[k]^1][a[j]]=1;
31 //      printf("(%d)",i);
32     }
33     for(i=2;i<=53;i++){
34         for(j=2;j<=53;j++)if(mp[j][i])rd[i]++;
35         if(!rd[i])dl[++r]=i;
36     }
37     while(l<r)
38         for(int now=dl[++l],i=2;i<=53;i++)if(mp[now][i]&&!--rd[i])
39             dl[++r]=i;
40     if(r==52)puts("bounded");else puts("unbounded");
41 }
View Code

 

posted @ 2016-07-05 20:07  czllgzmzl  阅读(201)  评论(0编辑  收藏  举报