拓扑排序的经典题目 UVA1572
紫书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的更多相关文章
- HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- POJ 2367 (裸拓扑排序)
http://poj.org/problem?id=2367 题意:给你n个数,从第一个数到第n个数,每一行的数字代表排在这个行数的后面的数字,直到0. 这是一个特别裸的拓扑排序的一个题目,拓扑排序我 ...
- ACM/ICPC 之 拓扑排序范例(POJ1094-POJ2585)
两道拓扑排序问题的范例,用拓扑排序解决的实质是一个单向关系问题 POJ1094(ZOJ1060)-Sortng It All Out 题意简单,但需要考虑的地方很多,因此很容易将code写繁琐了,会给 ...
- 正向与反向拓扑排序的区别(hdu 1285 确定比赛名次和hdu 4857 逃生)
确定比赛名次 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- hiho一下 第四十八周 拓扑排序·二【拓扑排序的应用 + 静态数组 + 拓扑排序算法的时间优化】
题目1 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论,当 ...
- 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 ...
- 经典问题----拓扑排序(HDU2647)
题目简介:有个工厂的老板给工人发奖金,每人基础都是888,工人们有自己的想法,如:a 工人想要比 b 工人的奖金高,老板想要使花的钱最少 那么就可以 给b 888,给a 889 ,但是如果在此基础上, ...
- UVA-1572 Self-Assembly (图+拓扑排序)
题目大意:每条边上都有标号的正方形,两个正方形能通过相匹配的边连接起来,每种正方形都有无限多个.问能否无限延展下去. 题目分析:将边视为点,正方形视为边,建立无向图,利用拓扑排序判断是图否为DAG. ...
- 拓扑排序(附LeetCode题目)
算法期中考到一题关于拓扑序的题目,觉得很值得一写. 1.什么是拓扑序? 对一个有向无环图进行拓扑排序,假如图中存在一条从顶点A到顶点B的路径,则拓扑序中顶点A出现在顶点B的前面.要注意的是,这是对有向 ...
随机推荐
- ios控件 UIControl
< UIControl> 1 处理用户事件的控件的基类,如UIButton,UISlider等 2 一般不直接实例化,而是使用他的子类 3 可以通过跟踪触摸事件来设置和获取控件状态,并且这 ...
- sql server 2000/2005递归
/* 递归查询 塗聚文---SQL Server 2005环境下的实现: */--生成测试数据 create table Dept(ID int,ParentID int,msg varchar(20 ...
- 今天修改 wifi hal 的时候碰见一个问题
今天修改 supplicant_name的时候出现一个问题. 发现原来init.wifi.rc 的server的时候出现了一个问题. 名字不对,没有和 supplicant_name对应起来. 所以就 ...
- MyBatis SQL配置文件中使用#{}取值为null时却不报错的解决方案。
原因是因为#{kh_id} 这个参数名为小写,我之前写成了大写{#KH_ID}所以取不到值
- OpenLayer 3 鹰眼控件和全屏显示
<body> <div id="map"></div> <script> var map=new ol.Map({ target:& ...
- IE 和 FF 写不同的CSS
.FireFox 下如何使连续长字段自动换行 众所周知IE中直接使用word-wrap:break-word 就可以了, FF中我们使用JS插入的技巧来解决 <style type=" ...
- 动态链接库dll,导入库lib,静态链接库lib
目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库” ...
- Swift -> Optional嵌套 探讨
准备运动:Optional 的介绍 王巍的<Swifter>一书中,介绍了一个有用的命令:在 LLDB 中输入 fr v -R foo,可以查看foo 这个变量的内存构成.我们稍后的分析将 ...
- java 多线程机制
Example12_1.java public class Example12_1 { public static void main(String args[]) { //主线程 SpeakElep ...
- Activity not started, its current task has been brought to the front的解决办法
删除bin目录下所有文件,重新启动在试试