题意:

给出一些正方形,这些正方形的每一条边都有一个标号。这些标号有两种形式:1.一个大写字母+一个加减号(如:A+, B-, A-......), 2.两个0(如:00);这些正方形能够任意翻转和旋转。当两个正方形通过旋转或翻转,使得他们的公共边为同样大写字母而且符号相反时,他们就能够彼此结合拼在一起。如今给出n中正方形。每种正方形有无限多种,问这些正方形是否能拼成一个无限大的结构。

题解:

easy想到。要使这些正方形形成无限大地结构。那么这些正方形通过拼接后一定能循环(即通过不断地拼接出现了和曾经同样地正方形),那么就能够通过推断将这些正方形地全部可能地拼接方式连有向边。然后推断是否有有向环,就可以通过拓扑排序来推断。

代码:

#include <queue>
#include <vector>
#include <cstdio>
#include <string>
#include <sstream>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 52 + 10;
int G[maxn][maxn], vis[maxn]; int ID(char a, char b)
{
return (a - 'A')*2 + (b == '+' ? 0 : 1);
}
void conect(char a1, char a2, char b1, char b2)
{
if (a1 == '0' || b1 == '0')
{
return ;
}
int u = ID(a1, a2)^1, v = ID(b1, b2);
G[u][v] = 1;
}
bool dfs(int u)
{
vis[u] = -1;
for (int v = 0; v < 52; v++) if (G[u][v])
{
if (vis[v] == -1) return true;
if (!vis[v] && dfs(v)) return true;
}
vis[u] = 1;
return false;
}
bool find_cycle()
{
memset(vis, 0, sizeof(vis));
for (int i = 0; i < 52; i++) if (!vis[i])
{
if (dfs(i)) return true;
}
return false;
}
int main()
{
// freopen("/Users/apple/Desktop/in.txt", "r", stdin);
int n;
while(scanf("%d", &n) == 1 && n)
{
memset(G, 0, sizeof(G));
while (n--)
{
char s[10]; scanf("%s", s);
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++) if (i != j)
{
conect(s[i*2], s[i*2+1], s[j*2], s[j*2+1]);
}
}
}
if (find_cycle()) printf("unbounded\n");
else printf("bounded\n");
} return 0;
}

uvalive 6393(uva 1572) Self-Assembly 拓扑排序的更多相关文章

  1. UVA 1572 Self-Assembly(拓扑排序)

    1 // 把一个图的所有结点排序,使得每一条有向边(u,v)对应的u都排在v的前面. 2 // 在图论中,这个问题称为拓扑排序.(toposort) 3 // 不难发现:如果图中存在有向环,则不存在拓 ...

  2. UVa 1572 Self-Assembly (拓扑排序)

    题目链接: https://cn.vjudge.net/problem/UVA-1572 Automatic Chemical Manufacturing is experimenting with ...

  3. UVA.10305 Ordering Tasks (拓扑排序)

    UVA.10305 Ordering Tasks 题意分析 详解请移步 算法学习 拓扑排序(TopSort) 拓扑排序的裸题 基本方法是,indegree表示入度表,vector存后继节点.在tops ...

  4. Uva 10305 - Ordering Tasks 拓扑排序基础水题 队列和dfs实现

    今天刚学的拓扑排序,大概搞懂后发现这题是赤裸裸的水题. 于是按自己想法敲了一遍,用queue做的,也就是Kahn算法,复杂度o(V+E),调完交上去,WA了... 于是检查了一遍又交了一发,还是WA. ...

  5. UVa 10305 - Ordering Tasks (拓扑排序裸题)

    John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...

  6. UVA 10305 Ordering Tasks(拓扑排序的队列解法)

    题目链接: https://vjudge.net/problem/UVA-10305#author=goodlife2017 题目描述 John有n个任务,但是有些任务需要在做完另外一些任务后才能做. ...

  7. Ordering Tasks UVA - 10305 图的拓扑排序

    John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...

  8. UVA 12263 Rankings(拓扑排序)

    给出一个n个数的序列1,然后有m个改动(a, b),在序列2中a跟b在序列中的相对顺序改变.求符合题意的序列2. 题中说道如果一个数的位置不确定,则输出‘?' ,仔细想想,这种情况是不会存在的,因为在 ...

  9. UVA - 1423 Guess (拓扑排序)

    题意:已知矩阵S,求序列a.已知矩阵Sij = “ + ” if ai + . . . + aj > 0; Sij = “ − ” if ai + . . . + aj < 0; and ...

随机推荐

  1. 56.lambda表达式与绑定以及伪函数和绑定

    #include <iostream> #include <functional> using namespace std; using namespace std::plac ...

  2. 转 SQL集合函数中利用case when then 技巧

    SQL集合函数中利用case when then 技巧 我们都知道SQL中适用case when then来转化数据库中的信息 比如  select (case sex when 0 then '男' ...

  3. Stacked Autoencoders

    转自:http://www.cnblogs.com/tornadomeet/archive/2013/03/25/2980357.html 如果使用多层神经网络的话,那么将可以得到对输入更复杂的函数表 ...

  4. Hyperic

    https://my.oschina.net/hyperichq/blog/525590

  5. 洛谷 P3385 【模板】负环

    P3385 [模板]负环 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M ...

  6. 6lession-基本数据类型

    因为自己是根据网上教程学习的,所以以下内容参考自 http://www.w3cschool.cc/python/python-variable-types.html python支持物种数据类型,分别 ...

  7. thinkphp事务处理以及无效时的解决方案(整理)

    thinkphp事务处理以及无效时的解决方案(整理) 一.总结 一句话总结:要程序里面支持事务,首先连接的数据库和数据表必须支持事务 mysql 1.InnoDB和MyISAM对事务的支持怎么样? I ...

  8. thinkphp多层volist实现多表查询

    thinkphp多层volist实现多表查询 一.总结 二.截图 三.代码 1.控制器 2.视图

  9. ubuntu搭建交叉编译环境makeinfo: command not found

    解决办法:sudo apt-get install texinfo

  10. 基于jQuery的一组图片的滚动

    css: .displayB{display:block;}.fl{float:left;}.fr{float: right;}.posAb{position: absolute;}.posRe{po ...