原题下载 : 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)

 1 //date 20140113
 2 #include <cstdio>
 3 #include <cstring>
 4
 5 const int maxn = 100;
 6 const int maxm = 500000;
 7
 8 int n;
 9 char tmp[10];
10 int tmp2[10];
11
12 inline int anti(int x)
13 {
14     if(x <= 26)return x + 26;
15     else return x - 26;
16 }
17
18 struct edge
19 {
20     int v, next;
21 }E[maxm];
22
23 int a[maxn];
24 int ind[maxn];
25 int nedge;
26
27 inline void add(int u, int v)
28 {
29     E[++nedge].v = v;
30     E[nedge].next = a[u];
31     a[u] = nedge;
32     ind[v]++;
33 }
34
35 inline int TopSort()
36 {
37     static int s[maxn];
38     int top = 0;
39     for(int i = 1; i <= 52; ++i)if(ind[i] == 0)s[++top] = i;
40     while(top > 0)
41     {
42         int x = s[top--];
43         for(int j = a[x]; j; j = E[j].next)
44             if((--ind[E[j].v]) == 0)s[++top] = E[j].v;
45     }
46     for(int i = 1; i <= 52; ++i)if(ind[i])return true;
47     return false;
48 }
49
50 int main()
51 {
52     freopen("assembly.in", "r", stdin);
53     freopen("assembly.out", "w", stdout);
54
55     while(scanf("%d\n", &n) != EOF)
56     {
57     nedge = 0;
58     memset(ind, 0, sizeof ind);
59     memset(E, 0, sizeof E);
60     for(int i = 1; i <= n; ++i)
61     {
62         int w = 0;
63         scanf("%s", tmp + 1);
64         if(tmp[1] != '0'){tmp2[++w] = tmp[1] - 'A' + 1; if(tmp[2] == '-')tmp2[w] += 26;}
65         if(tmp[3] != '0'){tmp2[++w] = tmp[3] - 'A' + 1; if(tmp[4] == '-')tmp2[w] += 26;}
66         if(tmp[5] != '0'){tmp2[++w] = tmp[5] - 'A' + 1; if(tmp[6] == '-')tmp2[w] += 26;}
67         if(tmp[7] != '0'){tmp2[++w] = tmp[7] - 'A' + 1; if(tmp[8] == '-')tmp2[w] += 26;}
68         for(int j = 1; j <= w; ++j)
69             for(int k = 1; k <= w; ++k)
70                 if(j != k)add(tmp2[j], anti(tmp2[k]));
71     }
72
73     if(TopSort())printf("unbounded\n");
74     else printf("bounded\n");
75     }
76     return 0;
77 }

注意事项:注意读入……

转载于:https://www.cnblogs.com/w007878/p/3534355.html

ACM - ICPC World Finals 2013 A Self-Assembly相关推荐

  1. 《算法竞赛入门经典》 例题 4-4 信息编码 (Message Decoding,ACM,ICPC World Finals 1991,UVa 213)

    原题及翻译 Some message encoding schemes require that an encoded message be sent in two parts. 某些消息编码方案要求 ...

  2. 《算法竞赛入门经典》习题4-2 正方形 (Squares,ACM,ICPC World Finals 1990,UVa201)——仅提供大体方法

    原题及翻译 A children's board game consists of a square array of dots that contains lines connecting some ...

  3. 数数正方形(ACM/ICPC World Finals)

    题目:有n行n列(2<=n<=9)的小黑点,还有m条线段连接其中的一些黑点,统计这些线段连成了多少个正方形(每种边长分别统计) 行从上到下编号为1~n,列从上到下编号为1~n.边用 H(i ...

  4. 谜题 (Puzzle,ACM/ICPC World Finals 1993,UVa227)

    题目描述:算法竞赛入门经典习题3-5 题目思路:模拟题 #include <stdio.h> #include <string.h> #define maxn 55 char ...

  5. 习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994, UVa232)

    原题vjudge 输入一个r行c列(1≤r,c≤10)的网格,黑格用"*"表示,每个白格都填有一个字母. 如 果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出 ...

  6. 例题5-10 PGA巡回赛的奖金(PGA Tour Prize Money,ACM/ICPC World Finals 1990 UVa207)

    原题链接:https://vjudge.net/problem/UVA-207 分类:耐力 备注:排序和其他细节处理 前言:这是我第二次默写刘老师的代码了,真的崩溃,错一点点细节都不行,对着uDebu ...

  7. UVa816 例题 6-14 Abbott的复仇 (Abbott's Revenge,ACM/ICPC World Finals 2000)

    原题链接: UVa-816 题目大意: 模有一个最多包含9*9个交叉点的迷宫.输入起点.离开起点时的朝向和终点,求一条最短路径.(具体题目参考原题和紫书) 解题思路: 本题是一道用BFS求最短路径的迷 ...

  8. 习题7-1 消防车(Firetruck,ACM/ICPC World Finals 1991, UVa208)

    原题链接:https://vjudge.net/problem/UVA-208 备注:回溯法 分类:DFS 代码如下: #include<cstdio> #include<cstri ...

  9. 习题7-3 多米诺效应(The Domino Effect, ACM/ICPC World Finals 1991, UVa211)

    谜一般的格式换行,为啥格式错报WA额. 这题也是用回溯法解决,只是判断情况稍微复杂些. 本质都是相同的,每次有两种决策,一行一行来处理. 当进行到某一行时,上一行还存在未vis的位置则回溯. #inc ...

最新文章

  1. .net2.0网站多语言
  2. 【Python基础】拯救你奇丑无比的Python代码的神器
  3. JDOM/XPATH编程指南
  4. Android日期对话框NumberPicker的用法教程
  5. 单链表删除所有值为x的元素_线性表之单链表
  6. 应用程序错误 应用程序发生异常w3wp.exe
  7. MYSQL多线程插入操作
  8. vue 指令 v-on 事件修饰符-键盘事件-键盘事件梳理
  9. jQuery 鼠标拖拽移动窗口
  10. Python入门--for循环
  11. 在线拍卖系统代码_来了来了,轻工业领域拍卖的福利来啦!聚拍网终于扩展新范围啦...
  12. 2022年12月最新微博新版批量删除微博博文代码_删除清空微博博文的微博批量删除代码与方法
  13. Pygame实战:多年后“魂斗罗”像素风归来 不止是经典与情怀@全体成员
  14. PHP explode()和implode()的使用方法
  15. JavaScript 每日一题---LeetCode 121. 买卖股票的最佳时机
  16. c++中new是否会自动初始化
  17. 重庆5G最新规划:明年建成3万个5G基站,力争主城区5G全覆盖
  18. 10 Python计算生态
  19. linux pam 解锁_linux pam锁定用户
  20. 【牛客 错题集】Linux系统方面错题合集

热门文章

  1. java回调和监听的区别_java监听机制的原理-回调机制
  2. 使用python+机器学习方法进行情感分析(详细步骤)
  3. qt制作位图led点阵_LED显示屏知识详细讲解
  4. 期末计算机课总结100字,学期总结:学期总结100字
  5. php视图最佳实践,PHP 的最佳实践
  6. python编程常用类型_Python 高级编程系列__03:python 中常见的内置类型
  7. 查询很慢会导致锁表吗_MySQL的insert into select 引发锁表
  8. scrapy爬虫+echarts数据分析(安居客)
  9. python爬小说目录_【python入门爬虫】爬取笔趣阁小说
  10. 某大型银行深化系统技术方案之十一:核心层之业务活动监控