P1347 排序 (拓扑排序,tarjan)
题目
解析
打开一看拓扑排序,要判环。
三种情况
- 有环(存在矛盾)
- 没环但在拓扑排序时存在有两个及以上的点入度为0(关系无法确定)
- 除了上两种情况(关系可确定)
本来懒了一下,直接在排序时判环,然后一直WA,遂怒写tarjan判环,第一个点注意特判两个点相同的情况,注意重边。
然后就有了这又臭又长的
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
int n, m, num, sum, tot;
int du[N], head[N], in[N], ans[N], dfn[N], low[N], size[N];
bool vis[N];
char s[N];
queue<int>q;
struct node {
int v, nx;
} e[N];
template<class T>inline void read(T &x) {
x = 0; int f = 0; char ch = getchar();
while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
x = f ? -x : x ;
return;
}
inline void add(int u, int v) {
for (int i = head[u]; ~i; i = e[i].nx) if (e[i].v == v) return;
e[++num].nx = head[u], e[num].v = v, head[u] = num, in[v]++;
}
int topo() {
int tmp = 0, cnt = 0;
for (int i = 1; i <= n; ++i) if (!du[i]) q.push(i), tmp++;
if (tmp > 1) return 0;
while (!q.empty()) {
tmp = 0, cnt++;
int u = q.front(); q.pop();
ans[cnt] = u;
for (int i = head[u]; ~i; i = e[i].nx) {
int v = e[i].v;
du[v]--;
if (!du[v]) q.push(v), tmp++;
}
if (tmp > 1) return 0;
}
return 1;
}
stack<int>sta;
void tarjan(int u) {
dfn[u] = low[u] = ++tot;
vis[u] = 1;
sta.push(u);
for (int i = head[u]; ~i; i = e[i].nx) {
int v = e[i].v;
if (!dfn[v]) tarjan(v), low[u] = min(low[u], dfn[u]);
else if (vis[v]) low[u] = min(low[u], dfn[v]);
}
if (dfn[u] == low[u]) {
int x = -1; sum++;
while (x != u) {
x = sta.top(), sta.pop();
vis[x] = 0, size[sum]++;
}
}
}
int main() {
memset(head, -1, sizeof head);
read(n), read(m);
for (int i = 1; i <= m; ++i) {
scanf("%s", s);
add(s[0] - 'A' + 1, s[2] - 'A' + 1);
if(s[0] == s[2]) {
printf("Inconsistency found after %d relations.", i);
return 0;
}
sum = tot = 0;
memset(dfn, 0, sizeof dfn);
memset(low, 0, sizeof low);
memset(vis, 0, sizeof vis);
memset(size, 0, sizeof size);
for (int j = 1; j <= n; ++j) if (!dfn[j]) tarjan(j);
for (int j = 1; j <= sum; ++j) if (size[j] > 1) {
printf("Inconsistency found after %d relations.", i);
return 0;
}
memcpy(du, in, sizeof du);
while (!q.empty()) q.pop();
int k = topo();
if (k == 1) {
printf("Sorted sequence determined after %d relations: ", i);
for (int j = 1; j <= n; ++j) printf("%c", ans[j] + 'A' - 1);
printf(".");
return 0;
} else continue;
}
printf("Sorted sequence cannot be determined.");
return 0;
}
P1347 排序 (拓扑排序,tarjan)的更多相关文章
- POJ1094 字母排序(拓扑排序)
该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列.是典型的拓扑排序,但输出格式上确有三种形式: 1.该字母序列有序,并依次输出: 2.该序列不能判断是否有序: 3.该序列字母次 ...
- python 排序 拓扑排序
在计算机科学领域中,有向图的拓扑排序是其顶点的先行排序,对于每个从顶点u到顶点v的有向边uv,在排序的结果中u都在v之前. 如果图是有向无环图,则拓扑排序是可能的(为什么不说一定呢?) 任何DAG具有 ...
- 拓扑排序(三)之 Java详解
前面分别介绍了拓扑排序的C和C++实现,本文通过Java实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处 ...
- 拓扑排序(二)之 C++详解
本章是通过C++实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处:http://www.cnblogs. ...
- 拓扑排序(一)之 C语言详解
本章介绍图的拓扑排序.和以往一样,本文会先对拓扑排序的理论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑 ...
- 拓扑排序 Codeforces Round #290 (Div. 2) C. Fox And Names
题目传送门 /* 给出n个字符串,求是否有一个“字典序”使得n个字符串是从小到大排序 拓扑排序 详细解释:http://www.2cto.com/kf/201502/374966.html */ #i ...
- 有向图和拓扑排序Java实现
package practice; import java.util.ArrayDeque; import java.util.Iterator; import java.util.Stack; pu ...
- 拓扑排序的 +Leapms 线性规划模型
知识点 拓扑排序 拓扑排序的+Leapms模型 无圈有向图 一个图G(V,E), 如果边有向且不存在回路,则为无圈有向图.在无圈有向图上可以定义拓扑排序.下图是一个无圈有向图的例子. 拓扑排序 给定一 ...
- POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39602 Accepted: 13 ...
随机推荐
- 【转】目前为止最透彻的的Netty高性能原理和框架架构解析
转自:https://zhuanlan.zhihu.com/p/48591893 1.引言 Netty 是一个广受欢迎的异步事件驱动的Java开源网络应用程序框架,用于快速开发可维护的高性能协议服务器 ...
- ModuleNotFoundError: No module named 'pymysql'
出现此提示表示系统中没有安装PyMySQL,可以通过pip PyMySQL进行安装. 安装之后,执行import pymysql仍然不可用! why? 检查后发现系统中存在python2与python ...
- 虚拟环境上的jupyterhub开机启动设置
为了让jupyterhub 开机启动,或者以服务的方式启动,折腾了好久.环境 ubuntu 16.04anaconda >= 4.5python35 jupyterhub 0.9.4node 6 ...
- Myeclipse安装Maven插件
Myeclipse安装Maven插件 一.下载Maven 官网下载maven插件 http://maven.apache.org/download.cgi 下载apache-maven-3.6.3- ...
- API调试工具--------Postman
Postman一款非常流行的API调试工具.其实,开发人员用的更多.因为测试人员做接口测试会有更多选择,例如Jmeter.soapUI等.不过,对于开发过程中去调试接口,Postman确实足够的简单方 ...
- 让Mac终端保持(SSH)与远程的连接状态
编辑 /etc/ssh/ssh_config 添加以下设置可解决这个问题: # 断开时重试连接的次数 ServerAliveCountMax 5 # 每隔5秒自动发送一个空的请求以保持连接 Serve ...
- Mac下iTerm2使用
之前一直使用 Mac OS 自带的终端,用起来虽然有些不太方便,但总体来说还是可以接受的,是有想换个终端的想法,然后今天偶然看到一个终端利器 iTerm2,发现真的很强大,也非常的好用,按照网上配置了 ...
- Cassandra开发入门文档第一部分
Cassandra的特点 横向可扩展性: Cassandra部署具有几乎无限的存储和处理数据的能力.当需要额外的容量时,可以简单地将更多的机器添加到集群中.当新机器加入集群时,Cassandra需要对 ...
- gitlib配置push后自动触发jenkins构建sonar扫描
jenkins所用到的插件: Gitlab Hook Plugin 配置步骤 1.先进入gitlab的个人设置,生成api token 2.复制生成的访问令牌,打开jenkins的凭据,添加选择类型是 ...
- 【python基础】setproctitle的安装与使用
前言 setproctitle模块允许设置进程名称. 安装 pip install setproctitle 使用 参考 1. setproctitle: 完