码迷,mamicode.com
首页 > 其他好文 > 详细

【图论】Self-Assembly(6-19)

时间:2017-08-06 23:05:31      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:图论   bool   span   style   continue   编号   有向环   ons   std   

[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)

标签:图论   bool   span   style   continue   编号   有向环   ons   std   

原文地址:http://www.cnblogs.com/wxjor/p/7296175.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!