【圖論】Self-Assembly(6-19)
阿新 • • 發佈:2017-08-06
inline const 分析 i++ 不能 hash unbound tac 正方形
[UVA1572]Self-Assembly
算法入門經典第6章6-19(P172)
題目大意:有一些正方形,每條邊上都有A-~Z- A+~Z+的編號,或者00,A+的邊可以拼A-,反之亦然。00的邊什麽都不能拼。問是否能無限去拼。
試題分析:直接做沒有頭緒,但是發現可以旋轉和翻轉,這樣就可以從任意正方形喀什了。我們將A-~Z+這52種連有向邊,最後判斷有沒有有向環即可。
#include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<queue> #include<stack> #include<algorithm> using namespace std; inline int read(){ int x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘; return x*f; } const int MAXN=100001; const int INF=999999; int N,M; int T; char a[5],b[5]; vector<int> vec[101]; int vis[1001]; int Hash(int k){ return (a[k]-‘A‘+1)*2-(b[k]==‘-‘?1:0); } bool dfs(int x){ vis[x]=-1; if(x%2==0) x--; else x++; for(int i=0;i<vec[x].size();i++){ int to=vec[x][i]; if(vis[to]==-1) return true; else if(!vis[to]&&dfs(to)) return true; } if(x%2==0) x--; else x++; vis[x]=1; return false; } int main(){ while(scanf("%d",&N)!=EOF){ for(int i=1;i<=70;i++) vec[i].clear(); for(int i=1;i<=N;i++){ for(int j=1;j<=4;j++) cin>>a[j]>>b[j]; for(int j=1;j<=4;j++){ if(a[j]==‘0‘) continue; for(int k=j+1;k<=4;k++){ if(a[k]==‘0‘) continue; int at=Hash(j); int bt=Hash(k); vec[at].push_back(bt); vec[bt].push_back(at); } } } memset(vis,0,sizeof(vis)); bool flag=false; for(int i=1;i<=52;i++){ if(!vis[i]&&dfs(i)) {flag=true; break;} } if(flag){ puts("unbounded"); } else puts("bounded"); } }
【圖論】Self-Assembly(6-19)