ACM - ICPC World Finals 2013 A Self-Assembly
原题下载 : http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf
这道题其实是2013年我AC的第一道题,非常的开心,这两天把2013年World Finals我能写的题都写的差不多了(我只写了A B C D F H I这七道题)开始着手来写解题报告,部分题目在UVaOJ上还存在超时,但是Tsinsen上面都AC了,题目的翻译转自清橙上国家集训队员们的翻译。每道题会提供题目翻译、题目大意、题目思路与解法、复杂度分析、参考代码以及我遇到的一些问题的提醒。特别感谢hockey、gy帮我讲解这些题目。
题目翻译:
问题描述
自动化学制造(Automatic Chemical Manufacturing,简称ACM)正在对一个叫自组装(self-assembly)的过程进行实验。在这个过程中,有着天然相互吸引力的分子被混合在溶液中,任由它们聚集组合成更大的结构。但是有一个问题随之出现:有时候,分子们会把自身组合成一个无限大的结构体,以至于把容器撑爆。
你需要写一个程序来判断一个给定的分子集合是否可能组合成一个无限大的结构体。为了使问题简化,你可以作以下两个假设:
1.
问题被限制在二维平面上。
2.
分子集合中的每个分子都被表示成一个正方形。其中正方形的四条边分别代表分子间相连接的四个表面。
你将从数据中得到每种分子的描述。每种分子有四个连接标识来分别表示每条边能与另外分子的哪种边相连。连接标识有两种:
●
一个大写字母(A,…,Z)加上一个
‘+’
号或一个
‘-’
号。两条边能并在一起当且仅当两者的字母相等且符号相反。比方说,‘A+’
与
‘A-’
兼容,但与
‘A+’
或
‘B-’
不兼容
●
两个零
‘00’。这条边将不和任意一条边兼容(包括‘00’)。
假设每种分子都有无限个,并且每个分子都可以旋转和翻转。当分子将自身组成一个结构体时,相互贴合的边必须能够相互兼容,当然,无论边的连接标识是什么,它都可以不与另外边贴合。
图1
是一个由三种分子组成的一个有限的结构体(它们也有可能组成另外的有限结构体)。
输入格式
输入第一行一个数n,表示分子的种类。
第二行包含n
个由一个空格隔开的长度为8
的字符串,每个串描述一种分子。
输出格式
输出一行一个英文单词,如果能组成无限大的结构体,输出unbounded,否则输出bounded。
样例输入
3
A+00A+A+
00B+D+A- B-C+00C+
样例输出
bounded
样例输入
1
K+K-Q+Q-
样例输出
unbounded
数据规模和约定
n
≤ 40000
题目大意:
给出n个正方形分子,每个分子的四条边上各有一些属性,属性可能是一个大写字母和一个正负号或者是“00”。如果两个分子的两条边正巧相反(我们称A+与A-、B+与B-这样的关系为相反,特别地,00不与任何东西相反),那么这两条边可以连接在一起。每种分子有无数多个,分子可以任意旋转或翻转,求是否存在一种连接方式可以使分子无限制地链接下去
思路分析:
看到这道题时,首先注意到每个分子无论怎么转都无所谓,所以势必不会出现a与b能连接却被另一个分子“卡住”的情形,我们可以将每个分子抽象成一个点,然后将所有可以连接的分子连边然后找环,如果找到环就视为可以无限连接,但是这样做会出现反例:如果有四种分子分别为[A+ 00 00 00] [A- 00 00 00] [A+ B+ 00 00] [A- B+ 00 00],这样我们会找到一个无向环但是事实上这四个分子是不可能无限连接的。问题出在我们只限定了连接方式,但是没有具体限定具体的连接关系,也就是说一个分子可能和其他的很多东西连边而事实上是不可能同时与它们直接连接的,所以说我们的模型还需要细化,需要限制到每条边在连接时只能用一次,所以我们可以将每个分子用四个点表示,分别是它的四条边,然后将四条边分别相连,然后将所有满足相反关系的两个点相连,然后寻找无向环,这样做的直接问题导致边数会达到n^2级别,不仅会超时而且难以存储。接下来我们可以试图构建一个等价的模型——将每一个属性(A+、A-、B+、B-......)抽象成一个点,然后按照上面的方法连接,但是我们需要加上一个条件:这个环的长度一定是偶数而且是一条由于同一分子关系的边和一条由于相反关系的边交错组成,这样的话太麻烦了,我们不妨把相反关系相连的点看做逻辑上相连而非直接相连,即找到一个点时立刻跳转到它的相反点,这样的话就等价于将分子上的每一个属性点和同一分子的其它属性点的相反点直接用有向边相连,然后寻找一个环就可以了
算法过程:
1.读入并处理(有点麻烦……)
2.将每个分子的四个属性点分别和其它属性点的相反点连接(忽略所有的“00”)
3.用拓扑排序找环
复杂度分析:建图之后边数为12n,点数为52,总复杂度是O(n)
//date 20140113
#include <cstdio>
#include <cstring> const int maxn = ;
const int maxm = ; int n;
char tmp[];
int tmp2[]; inline int anti(int x)
{
if(x <= )return x + ;
else return x - ;
} struct edge
{
int v, next;
}E[maxm]; int a[maxn];
int ind[maxn];
int nedge; inline void add(int u, int v)
{
E[++nedge].v = v;
E[nedge].next = a[u];
a[u] = nedge;
ind[v]++;
} inline int TopSort()
{
static int s[maxn];
int top = ;
for(int i = ; i <= ; ++i)if(ind[i] == )s[++top] = i;
while(top > )
{
int x = s[top--];
for(int j = a[x]; j; j = E[j].next)
if((--ind[E[j].v]) == )s[++top] = E[j].v;
}
for(int i = ; i <= ; ++i)if(ind[i])return true;
return false;
} int main()
{
freopen("assembly.in", "r", stdin);
freopen("assembly.out", "w", stdout); while(scanf("%d\n", &n) != EOF)
{
nedge = ;
memset(ind, , sizeof ind);
memset(E, , sizeof E);
for(int i = ; i <= n; ++i)
{
int w = ;
scanf("%s", tmp + );
if(tmp[] != ''){tmp2[++w] = tmp[] - 'A' + ; if(tmp[] == '-')tmp2[w] += ;}
if(tmp[] != ''){tmp2[++w] = tmp[] - 'A' + ; if(tmp[] == '-')tmp2[w] += ;}
if(tmp[] != ''){tmp2[++w] = tmp[] - 'A' + ; if(tmp[] == '-')tmp2[w] += ;}
if(tmp[] != ''){tmp2[++w] = tmp[] - 'A' + ; if(tmp[] == '-')tmp2[w] += ;}
for(int j = ; j <= w; ++j)
for(int k = ; k <= w; ++k)
if(j != k)add(tmp2[j], anti(tmp2[k]));
} if(TopSort())printf("unbounded\n");
else printf("bounded\n");
}
return ;
}
注意事项:注意读入……
ACM - ICPC World Finals 2013 A Self-Assembly的更多相关文章
- ACM - ICPC World Finals 2013 C Surely You Congest
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 试题来源 ACM/ICPC World Fin ...
- ACM - ICPC World Finals 2013 F Low Power
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 问题描述 有n个机器,每个机器有2个芯片,每个 ...
- ACM - ICPC World Finals 2013 I Pirate Chest
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 问题描述 海盗Dick受够了在公海上厮杀.抢劫 ...
- ACM - ICPC World Finals 2013 H Матрёшка
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 问题描述 俄罗斯套娃是一些从外到里大小递减的传 ...
- ACM - ICPC World Finals 2013 D Factors
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 问题描述 一个最基本的算数法则就是大于1的整数 ...
- ACM - ICPC World Finals 2013 B Hey, Better Bettor
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 这题真心的麻烦……程序不长但是推导过程比较复杂,不太好想 ...
- [算法竞赛入门经典]Message Decoding,ACM/ICPC World Finals 1991,UVa213
Description Some message encoding schemes require that an encoded message be sent in two parts. The ...
- UVa210 Concurrency Simulator (ACM/ICPC World Finals 1991) 双端队列
Programs executed concurrently on a uniprocessor system appear to be executed at the same time, but ...
- 谜题 (Puzzle,ACM/ICPC World Finals 1993,UVa227)
题目描述:算法竞赛入门经典习题3-5 题目思路:模拟题 #include <stdio.h> #include <string.h> #define maxn 55 char ...
随机推荐
- tomcat7.0.47 修改tomcat窗口名称
最近使用的是 apache - tomcat 集群,为了方便管理上想要修改tomcat命令窗口的名字来区分不同的tomcat,我在网上找了些资料,顺便总结一下,方便自己,方便他人 修改如下: 找到to ...
- 完整实例(C# Socket)
问题描述: 现在创建一个C# Socket实例,客户端断开服务器能立刻输出断开连接客户端信息 服务器端断开,客户端能立刻察觉服务器状态 问题解决: 服务器端代码: 客户端代码: 以上 ...
- 使用JS启动本地应用程序、屏幕键盘
问题描述: 现在希望在Web端使用JS调用本地应用程序 问题解决: (1)使用JS启动本地应用程序 使用上述代码重点是创建了一个ActiveXObject的对象 参考说明: ...
- [设计模式] 17 中介者模式 Mediator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...
- 【Unity3D】iOS 推送实现
原地址:http://www.iappfan.com/%E3%80%90unity3d%E3%80%91ios-%E6%8E%A8%E9%80%81%E5%AE%9E%E7%8E%B0/ #impor ...
- Linq to EF 与Linq to Object 使用心得
大家都知道Linq既可以用来查询数据库对象(我这里指的是Entity FrameWork里的Model对象),也可以用来查询内存中的IEnumerable对象. 两者单独查询时都不会出现什么问题,不过 ...
- ZOJ 1642 Match for Bonus (DP)
题目链接 题意 : 给你两个字符串,两个字符串都有共同的字母,给你每个字母的值,规则是,找出两个字符串中的共同的一个字母,然后这个字母的值就可以加到自己的分数上,但是这步操作之后,这两个字母及其之前的 ...
- SDUT1479数据结构实验之栈:行编辑器
先是普通的数组做法 #include<stdio.h> #include<string.h> int main() { ] ; while(~scanf("%s&qu ...
- Oracle 9 - 分析undo和snapshot too old错误
什么操作会生成undo INSERT生成的UNDO最少,只要记录新的rowid UPDATE生成的undo多一点,它要记录修改前的数据中的那部分. DELETE生成最多的undo, 因为它要记录整行被 ...
- lintcode:Flip Bits 将整数A转换为B
题目: 将整数A转换为B 如果要将整数A转换为B,需要改变多少个bit位? 样例 如把31转换为14,需要改变2个bit位. ()10=()2 ()10=()2 挑战 你能想出几种方法? 解题: A- ...