紫书172的例题:

题目大意:有n种正放形,每种正方形的数量可视为无限多。已知边与边之间的结合规则,而且正方形可以任意旋转和反转,问这n中正方形是否可以拼成无限大的图案

思路:首先因为是要无穷大,所以只要正方形之间的连接出现有向环及说明可以无限。但是如果单纯的对正方形进行枚举肯定会TLE,因此我们换一个思路。

首先有没有正方形是无所谓的,如果有一个是A-另外一个正方形里面有A+,管他是哪个正方形,只要能连过去就行了,反正只要最后如果能连回来就说明有环。

所以我们把所有的字母看成点,然后让正方形中每个字母进行连线即可。最后利用拓扑序和染色法求解是否存在环即可。

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h> #define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
const int maxn = + ;
int n;
bool G[][]; int cal(char a, char b){
int res = (a - 'A') * + (b == '+' ? : );
return res;
} void connect(char a1, char a2, char b1, char b2){
int u = cal(a1, a2) ^ , v = cal(b1, b2);
G[u][v] = ;
} int vis[];
bool dfs(int u){
vis[u] = -;
for (int i = ; i < ; i++){
if (G[u][i]){
if (vis[i] < ) return true;
else if(!vis[i] && dfs(i)){
return true;
}
}
}
vis[u] = ;
return false;
} bool find_cir(){
memset(vis, , sizeof(vis));
for (int i = ; i < ; i++){
if (!vis[i] && dfs(i)) return true;
}
return false;
} int main(){
while (scanf("%d", &n) == && n){
memset(G, false, sizeof(G));
char ch[];
for (int i = ; i <= n; i++){
scanf("%s", ch);
for (int i = ; i < ; i++){
for (int j = ; j < ; j++){
if (i == j || ch[i * ] == '' || ch[j * ] == '') continue;
connect(ch[i * ], ch[i * + ], ch[j * ], ch[j * + ]);
}
}
}
if (find_cir()) printf("unbounded\n");
else printf("bounded\n");
}
return ;
}

拓扑排序的经典题目 UVA1572的更多相关文章

  1. HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. POJ 2367 (裸拓扑排序)

    http://poj.org/problem?id=2367 题意:给你n个数,从第一个数到第n个数,每一行的数字代表排在这个行数的后面的数字,直到0. 这是一个特别裸的拓扑排序的一个题目,拓扑排序我 ...

  3. ACM/ICPC 之 拓扑排序范例(POJ1094-POJ2585)

    两道拓扑排序问题的范例,用拓扑排序解决的实质是一个单向关系问题 POJ1094(ZOJ1060)-Sortng It All Out 题意简单,但需要考虑的地方很多,因此很容易将code写繁琐了,会给 ...

  4. 正向与反向拓扑排序的区别(hdu 1285 确定比赛名次和hdu 4857 逃生)

    确定比赛名次 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  5. hiho一下 第四十八周 拓扑排序·二【拓扑排序的应用 + 静态数组 + 拓扑排序算法的时间优化】

    题目1 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当 ...

  6. ZOJ - 3780-Paint the Grid Again-(拓扑排序)

    Description Leo has a grid with N × N cells. He wants to paint each cell with a specific color (eith ...

  7. 经典问题----拓扑排序(HDU2647)

    题目简介:有个工厂的老板给工人发奖金,每人基础都是888,工人们有自己的想法,如:a 工人想要比 b 工人的奖金高,老板想要使花的钱最少 那么就可以 给b 888,给a 889 ,但是如果在此基础上, ...

  8. UVA-1572 Self-Assembly (图+拓扑排序)

    题目大意:每条边上都有标号的正方形,两个正方形能通过相匹配的边连接起来,每种正方形都有无限多个.问能否无限延展下去. 题目分析:将边视为点,正方形视为边,建立无向图,利用拓扑排序判断是图否为DAG. ...

  9. 拓扑排序(附LeetCode题目)

    算法期中考到一题关于拓扑序的题目,觉得很值得一写. 1.什么是拓扑序? 对一个有向无环图进行拓扑排序,假如图中存在一条从顶点A到顶点B的路径,则拓扑序中顶点A出现在顶点B的前面.要注意的是,这是对有向 ...

随机推荐

  1. LeetCode OJ 66. Plus One

    Given a non-negative number represented as an array of digits, plus one to the number. The digits ar ...

  2. Git 删除文件

    在Git中,删除也是一种修改的操作,我们验证一下,先在工作目录中添加一个新文件test.txt,并且提交: $ git statusOn branch masterUntracked files:  ...

  3. A - 娜娜梦游仙境系列——诡异的钢琴

    A - 娜娜梦游仙境系列——诡异的钢琴 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Othe ...

  4. servlet第3讲(上集)----同一用户的不同页面共享数据

    1.方法综述 2.Cookie 3.sendRedict()方法     4.隐藏表单

  5. how computer boot up?

    The power button activates the power supply in the PC, sending power to the motherboard and other co ...

  6. QML中MouseArea元素的介绍

    原文:http://www.thisisqt.com/?action-viewnews-itemid-22 MouseArea元素的一个很典型的用法是和一个可视的item一起用,处理这个item的鼠标 ...

  7. perl中my和our的区别分析

    来源: http://www.jb51.net/article/35528.htm perl中our的用法require 5.006当版本号小于 5.006 的时候,会返回失败,从而导致模块加载失败. ...

  8. STM32F4系统时钟配置及描述

    STM32F4系统时钟配置及描述 stm32f407时钟配置方法(感觉很好,分享一下) STM32F4_RCC系统时钟配置及描述 STM32F4时钟设置分析 stm32f4 - 时钟树分析配置

  9. OpenLayer 3 鼠标位置坐标显示控件

    <body> <div id="map"> <div id="mouse-position"></div> &l ...

  10. 格式化格林威治时间(Wed Aug 01 00:00:00 CST 2012)

    1.如果格林威治时间时间是date类型.(这种格式最简单)       SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd") ...