UVA-1572 Self-Assembly(拓扑排序判断有向环)
题目:
给出几种正方形,每种正方形有无穷多个。在连接的时候正方形可以旋转、翻转。
正方形的每条边上都有一个大写英文字母加‘+’或‘-’、00,当字母相同符号不同时,这两条边可以相连接,00不能和任何边相连。
判断给出的正方形如果能无限连接下去就输出unbounded、不能就输出bounded。
思路:
这个题读完之后,一点思路都没有,看完紫书上的分析知道是用拓扑排序来判断有向环,但具体的构造还是不会……
1.将每个正方形看作一条边,在正方形每两条边上的字母(不包括00)之间连一条有向边构成一个有向图。
2.使用(2*n)^1 = (2*n+1)、(2*n+1)^1 = (2*n)。
3.利用拓扑排序来判断有没有有向环,有则输出unbounded、没有就输出bounded。
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1e9+7;
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
const int maxn = ;
int n,mp[maxn][maxn],vis[maxn]; int getId(char a,char b) {
return (a-'A')*+(b=='+' ? : );
} void solve(char x1,char x2, char y1,char y2) {
if(x1=='' || y1=='') {
return;
}
int x = getId(x1, x2)^;
int y = getId(y1,y2);
mp[x][y] = ;
} void insertG(char* str) {//建图
for(int i = ; i<; i+=) {
for(int j = ; j<; j+=) {
if(i!=j) {
solve(str[i],str[i+],str[j],str[j+]);
}
}
}
} bool dfs(int x) {
vis[x] = ;//正在被访问中
for(int i = ; i<; i++) {
if(mp[x][i]) {
if(vis[i])//如果已经被访问过,就是有环
{ return true; }
if(!vis[i] && dfs(i))//后续的递归中出现有环的情况
{return true;}
}
}
vis[x] = ;
return false;
} bool topuSort() {//拓扑排序
memset(vis,,sizeof(vis));
for(int i = ; i<; i++) {//个人理解因为可能有多个连通分量,所以每一个点都要跑一把
if(!vis[i] && dfs(i)) { //有环
return true;
}
}
return false;//没有环
} int main() {
while(scanf("%d",&n)!=EOF) {
char str[];
memset(mp,,sizeof(mp));
for(int i=; i<n; i++) {
scanf("%s",str);
insertG(str);
}
if(topuSort()) {
printf("unbounded\n");
} else {
printf("bounded\n");
}
}
return ;
}
UVA-1572 Self-Assembly(拓扑排序判断有向环)的更多相关文章
- hdoj 4324 Triangle LOVE【拓扑排序判断是否存在环】
Triangle LOVE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- UVA 1572 Self-Assembly(拓扑排序)
1 // 把一个图的所有结点排序,使得每一条有向边(u,v)对应的u都排在v的前面. 2 // 在图论中,这个问题称为拓扑排序.(toposort) 3 // 不难发现:如果图中存在有向环,则不存在拓 ...
- UVa 1572 Self-Assembly (拓扑排序)
题目链接: https://cn.vjudge.net/problem/UVA-1572 Automatic Chemical Manufacturing is experimenting with ...
- Lightoj 1003 - Drunk(拓扑排序判断是否有环 Map离散化)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1003 题意是有m个关系格式是a b:表示想要和b必须喝a,问一个人是否喝醉就看一个人是 ...
- hihocoder 1174 [BFS /拓扑排序判断是否有环]
hihocoder 1174 [算法]: 计算每一个点的入度值deg[i],这一步需要扫描所有点和边,复杂度O(N+M). 把入度为0的点加入队列Q中,当然有可能存在多个入度为0的点,同时它们之间也不 ...
- 拓扑排序 判断给定图是否存在合法拓扑序列 自家oj1393
//拓扑排序判断是否有环 #include<cstdio> #include<algorithm> #include<string.h> #include<m ...
- Uva 10305 - Ordering Tasks 拓扑排序基础水题 队列和dfs实现
今天刚学的拓扑排序,大概搞懂后发现这题是赤裸裸的水题. 于是按自己想法敲了一遍,用queue做的,也就是Kahn算法,复杂度o(V+E),调完交上去,WA了... 于是检查了一遍又交了一发,还是WA. ...
- UVa 10305 - Ordering Tasks (拓扑排序裸题)
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
- HDU 3342 Legal or Not(拓扑排序判断成环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 题目大意:n个点,m条有向边,让你判断是否有环. 解题思路:裸题,用dfs版的拓扑排序直接套用即 ...
随机推荐
- 如何配置MYSQL的MASTER---SLAVE复制备份?
如何配置MYSQL的MASTER---SLAVE复制备份? 一.配置一个mysql服务器做master: 在配置文件my.ini中添加如下内容: log-bin=matster-binlog- ...
- Bootstrap 模态窗口源码分析
前言: bootstrap的 js插件的源码写的非常好,也算是编写jquery插件的模范写法,本来还想大篇详细的分析一下呢,唉,没时间啊,很早之前看过的源码了,现在贴在了博客上, 300来行的代码,其 ...
- spring 之 IOC 依赖注入详解
当我们对一个javaBean进行实例化时,在原本的情况下我们会选择新建一个接口,然后进行实例化,为了进一步降低耦合度我们还会使用工厂模式进行封装. 例: 当我们想要去造,Chinese.America ...
- js验证手机号,身份证,车牌号验证
js验证手机号 <input type="text" class="identificationno"> // 身份证号码为15位或者18位,15 ...
- maven仓库管理
maven仓库管理很重要,如果是依赖jar下不到或下错了或出现莫名的报错.曾几何时为此花费了不少时间. 首先,注意自己maven仓库配置,里面有本地仓库目录和远程maven仓库,当自己本地没有依赖时可 ...
- npm 是干什么的?
网上的 npm 教程主要都在讲怎么安装.配置和使用 npm,却不告诉新人「为什么要使用 npm」.今天我就来讲讲这个话题. 本文目标读者是「不太了解 npm 的新人」,大神您别看了,不然又说我啰嗦了 ...
- ASP.NET给前端动态添加修改 CSS样式JS 标题 关键字(转载)
原文地址:http://www.cnblogs.com/xbhp/p/6392225.html 有很多网站读者能换自己喜欢的样式,还有一些网站想多站点共享后端代码而只动前段样式,可以采用动态替换CSS ...
- 微信H5页面 - 调酒
这是微信H5的一款小游戏(一款酒的推广活动),主要游戏页面如下: 游戏规则: 点击选择2个元素(圈圈图片),放入瓶中,使它们与瓶中已有的三个元素碰撞,调配佳酿. 只有选择正确的2个元素搭配,才可以调配 ...
- P3626 [APIO2009]会议中心
传送门 好迷的思路-- 首先,如果只有第一问就是个贪心,排个序就行了 对于第二问,我们考虑这样的一种构造方式,每一次都判断加入一个区间是否会使答案变差,如果不会的话就将他加入别问我正确性我不会证 我们 ...
- selenium对51job进行职位爬虫
selenium 爬虫流程如下: 1.对某职位进行爬虫 ---如:自动化测试 2.用到IDE为 pycharm 3.爬虫职位导入到MongoDB数据库中 4.在线安装 pip install pymo ...