1 // 把一个图的所有结点排序,使得每一条有向边(u,v)对应的u都排在v的前面。
2 // 在图论中,这个问题称为拓扑排序。(toposort)
3 // 不难发现:如果图中存在有向环,则不存在拓扑排序,反之则存在。
4 // 不包含有向环的有向图称为有向无环图(DAG)。
5 // 可以借助DFS完成拓扑排序:在访问完一个结点之后把它加到当前拓扑序的首部。
6
7 int c[maxn];
8 int topo[maxn],t;
9 bool dfs(int u)
10 {
11 c[u]=-1;//访问标志
12 for(int v=0;v<n;v++)
13 if(G[u][v])
14 {
15 if(c[v]<0) return false;//存在有向环,失败退出
16 else if(!c[v]&&!dfs(v)) return false;
17 }
18 c[u]=1;
19 topo[--t]=u;
20 return true;
21 }
22 bool toposort()
23 {
24 t=n;
25 memset(c,0,sizeof(c));
26 for(int u=0;u<n;u++)
27 {
28 if(!c[u])
29 if(!dfs(u))
30 return false;
31 }
32 return true;
33 }
34
35 // 这里用到了一个c数组,c[u]=0表示从来没有访问过(从来没有调用过dfs[u])
36 // c[u]=1表示已经访问过,并且还递归访问过它的所有子孙(即dfs(u)曾被调用过并且已经返回)
37 // c[u]=-1表示正在访问(即递归调用dfs(u)正在栈帧中,尚未返回)
38
39 // 可以用DFS求出有向无环图(DAG)的拓扑排序。
40 // 如果排序失败,说明该图存在有向环,不是DAG。

UVA 1572

https://vjudge.net/problem/UVA-1572

题目大意:有些种类的正方形,每条边有两个符号,‘00‘’不能与任何边相连,只有字母相同,“+-”相反才能相连,让判断是否用这些已有的正方形铺成无限大的平面

解题思路:将字母装华为数字例如A+A-转化为2n,2n+1,这样如果一个正方形x(A+)能和另一个正方形y(A-)相连,则正方形x每个边都能到达正方形y(A+A-连接了以后A+这个正方形就与y相连了,所以x的任一边都考可到达y),想判断是否能无限大,则三角形必须重复出现(即他们之间的连接点会重复出现,在有向图中存在环,现在只需判断是否能形成有向环,如已经有A+A-相连,再发现一个A+A-相连,这之间是一个重复的过程,则可以无限循环下去)

 1 #include <iostream>
2 #include <algorithm>
3 #include <string>
4 #include <sstream>
5 #include <set>
6 #include <vector>
7 #include <stack>
8 #include <map>
9 #include <queue>
10 #include <deque>
11 #include <cstdlib>
12 #include <cstdio>
13 #include <cstring>
14 #include <cmath>
15 #include <ctime>
16 #include <functional>
17 using namespace std;
18
19 #define maxn 60
20 char s[9];
21 int g[maxn][maxn], vis[maxn], n;
22
23 int id(char a1, char a2) //将正方形的每一条边都进行赋值,使其称为图中的结点
24 {
25 //将每条边转化为2n或者2n+1的形式
26 return (a1 - 'A') * 2 + (a2 == '+' ? 0 : 1);
27 }
28
29 void connect(char a1,char a2,char b1,char b2) //将配对的结点连边,为有向图建模
30 {
31 // 边的对应关系:
32 // A+ <<-->> A- 所以(a1,a2)一定能和(a1,a2)^1配对连接
33 // 又因为(a1,a2)与(b1,b2)存在于同一个正方形,他们两个也一定能连接
34 // 所以 (a1,a2)^1 <<-->>(b1,b2)
35 if(a1=='0'||b1=='0')
36 return ;
37 int u=id(a1,a2)^1;
38 int v=id(b1,b2);
39 g[u][v]=1;
40 }
41 bool dfs(int u)
42 {
43 vis[u]=-1;//表示结点u正在访问中
44 for(int i=0;i<maxn;i++)
45 if(g[u][i])
46 if(vis[i]==-1) return true;//在DFS的过程中访问到一个点也是-1,则说明这个点重复出现了,构成了有向环
47 else if(!vis[i]&&dfs(i)) //向深处递归,如果这个点未访问,
48 return true; //则访问它并且DFS判断它是否重复出现构成有向环
49 vis[u]=1;//访问结束变成1
50 return false;
51 }
52 bool judge()
53 {
54 memset(vis,0,sizeof(vis));
55 for(int i=0;i<maxn;i++)
56 if(!vis[i])//只找到一个环即可
57 if(dfs(i)) return true;
58 return false;
59 }
60 int main()
61 {
62 while(~scanf("%d",&n)&&n)
63 {
64 memset(g,0,sizeof(g));
65 while(n--)
66 {
67 cin>>s;
68 for(int i=0;i<4;i++)
69 for(int j=0;j<4;j++)
70 if(i!=j)
71 connect(s[i*2],s[i*2+1],s[j*2],s[j*2+1]);//同一个正方向的边互相建立联系
72 }
73 if(judge())
74 cout<<"unbounded"<<endl;
75 else
76 cout<<"bounded"<<endl;
77 }
78 return 0;
79 }

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. UVA 12263 Rankings(拓扑排序)

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

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

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

  9. UVa 1572 Self-Assembly (构造+拓扑排序。。。。。)

    题意:给定n个带标号的正方形,标号要么是一个大写字母加一个+或-,要么是00, 当且仅当大写字母相同并且符号相反时可以连接,问你给定的能不能拼成一个无限大的的东西. 析:说实话,真心没有看出来是拓扑排 ...

随机推荐

  1. SpringBoot-技术专区-用正确的姿势如何用外置tomcat配置及运行(Tomcat优化分析)

    前提概要 在特别特殊的时候,我们可能需要外置tomcat去运行程序,例如alitomcat等特殊场景,方便我们去定时化开发项目或者其他特殊场景. 外置tomcat执行 pom.xml文件首先更改打包方 ...

  2. C# CS0050 可访问性不一致: 返回类型 错误

    今天学习C#代码过程中,遇到可访问性不一致的错误: 严重性 代码 说明 项目 文件 行 禁止显示状态错误 CS0050 可访问性不一致: 返回类型"Transaction"的可访问 ...

  3. msfvenom简介

    写此文是因为网上资料杂乱,不方便查阅,辣眼睛 测试免杀的时候刚好用到这个功能,顺便写一下(0202年靠msfvenom生成的纯原生payload可以宣告死亡了,如果有查不出来的杀软可以退群了,这也叫杀 ...

  4. windows中抓取hash小结(上)

    我上篇随笔说到了内网中横向移动的几种姿势,横向移动的前提是获取了具有某些权限的用户的明文密码或hash,正愁不知道写点啥,那就来整理一下这个"前提"-----如何在windows系 ...

  5. 30 个极大提高开发效率超级实用的 VSCode 插件

    Visual Studio Code 的插件对于在提升编程效率和加快工作速度非常重要.这里有 30 个最受欢迎的 VSCode 插件,它们将使你成为更高效的搬砖摸鱼大师.这些插件主要适用于前端开发人员 ...

  6. Redis分布式锁的原理和实现

    前言 我们之前聊过redis的,对基础不了解的可以移步查看一下: 几分钟搞定redis存储session共享--设计实现:https://www.cnblogs.com/xiongze520/p/10 ...

  7. Java角度制向弧度制转化

    1.第一次写博客啊写博客啊写啊写0.0..0. 2.输入正多边形的边长·边数·求正多边形的面积 3.超级简单,可是在转弧度制那里有点懵,刚开始学Java,所以难免走弯路 4.代码如下: 1 publi ...

  8. js清空input file的值

    原文:js清空input file的值 在做选择本地图片上传的功能时遇到一个问题,第一次点file按钮选择图片完成会触发onchange事件,获取文件后动态在界面上创建img标签展示,但把创建的img ...

  9. windows10右键我的电脑,点击管理,提示该文件没有与之关联的应用来执行该操作,请安装应用,若已经安装应用,请在默认应用设置页面中创建关联……

    方法一 1.按WIN+R 调出运行对话框,然后输入bai gpedit.msc 回车:2.展开"计du算机配置"zhi-"Windows设置"-"安全 ...

  10. 关于Ubuntu18.04 linux系统下使用Tim QQ 微信

    先配上张图 步骤: 1.1 :需要安装环境deepin-wine 1.1:(你把他理解为jdk就好,没有jdk无法运行java程序,同理没有deepin-wine环境无法运行腾讯产品) 1.2 :去哪 ...