UVA-1572 Self-Assembly (图+拓扑排序)
题目大意:每条边上都有标号的正方形,两个正方形能通过相匹配的边连接起来,每种正方形都有无限多个。问能否无限延展下去。
题目分析:将边视为点,正方形视为边,建立无向图,利用拓扑排序判断是图否为DAG。
代码如下:
# include<iostream> # include<cstdio> # include<map> # include<queue> # include<string> # include<vector> # include<cstring> # include<algorithm> using namespace std; int vis[55],mp[55][55]; int get(char a,char b) { return (a-'A')*2+((b=='+')?1:0);///因为在这没注意运算符的优先级,一直WA。。。。。。 } void f(char *p) { for(int i=0;i<8;i+=2){ if(p[i]=='0') continue; for(int j=0;j<8;j+=2){ if(i==j||p[j]=='0') continue; int a=get(p[i],p[i+1])^1; int b=get(p[j],p[j+1]); mp[a][b]=1; } } } bool dfs(int u) { vis[u]=-1; for(int i=0;i<52;++i){ if(!mp[u][i]) continue; if(vis[i]==-1) return true; if(!vis[i]&&dfs(i)) return true; } vis[u]=1; return false; } bool judge() { memset(vis,0,sizeof(vis)); for(int i=0;i<52;++i) if(!vis[i]&&dfs(i)) return true; return false; } int main() { int n; char p[9]; while(scanf("%d",&n)==1) { memset(mp,0,sizeof(mp)); while(n--) { scanf("%s",p); f(p); } if(judge()) printf("unbounded\n"); else printf("bounded\n"); } return 0; }