题目

P1347 排序

解析

打开一看拓扑排序,要判环。

三种情况

  • 有环(存在矛盾)
  • 没环但在拓扑排序时存在有两个及以上的点入度为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)的更多相关文章

  1. POJ1094 字母排序(拓扑排序)

    该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列.是典型的拓扑排序,但输出格式上确有三种形式: 1.该字母序列有序,并依次输出: 2.该序列不能判断是否有序: 3.该序列字母次 ...

  2. python 排序 拓扑排序

    在计算机科学领域中,有向图的拓扑排序是其顶点的先行排序,对于每个从顶点u到顶点v的有向边uv,在排序的结果中u都在v之前. 如果图是有向无环图,则拓扑排序是可能的(为什么不说一定呢?) 任何DAG具有 ...

  3. 拓扑排序(三)之 Java详解

    前面分别介绍了拓扑排序的C和C++实现,本文通过Java实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处 ...

  4. 拓扑排序(二)之 C++详解

    本章是通过C++实现拓扑排序. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑排序的代码说明 4. 拓扑排序的完整源码和测试程序 转载请注明出处:http://www.cnblogs. ...

  5. 拓扑排序(一)之 C语言详解

    本章介绍图的拓扑排序.和以往一样,本文会先对拓扑排序的理论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 拓扑排序介绍 2. 拓扑排序的算法图解 3. 拓扑 ...

  6. 拓扑排序 Codeforces Round #290 (Div. 2) C. Fox And Names

    题目传送门 /* 给出n个字符串,求是否有一个“字典序”使得n个字符串是从小到大排序 拓扑排序 详细解释:http://www.2cto.com/kf/201502/374966.html */ #i ...

  7. 有向图和拓扑排序Java实现

    package practice; import java.util.ArrayDeque; import java.util.Iterator; import java.util.Stack; pu ...

  8. 拓扑排序的 +Leapms 线性规划模型

    知识点 拓扑排序 拓扑排序的+Leapms模型 无圈有向图 一个图G(V,E), 如果边有向且不存在回路,则为无圈有向图.在无圈有向图上可以定义拓扑排序.下图是一个无圈有向图的例子. 拓扑排序 给定一 ...

  9. POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39602   Accepted: 13 ...

随机推荐

  1. 【Beta】Scrum Meeting 9 & 助教参会记录

    目录 前言 任务分配 燃尽图 会议照片 签入记录 上周助教交流总结 Q:项目进度如何? Q:有关commit与issue关联的问题? Q:人员变动后分工的变化情况? Q:接下来还有什么新功能? Q:大 ...

  2. abp中使用同步方法调用异步方法

    var result= AsyncHelper.RunSync(()=>{   return  _service.GetUserAsync();   });

  3. Kibana数据可视化

    Kibana数据可视化 1,3.1使用logstash导入数据的问题 会出现错误提示: [location] is defined as an object in mapping [doc] but ...

  4. 946. Validate Stack Sequences

    946. Validate Stack Sequences class Solution { public: bool validateStackSequences(vector<int> ...

  5. Docker入门-docker运行springboot应用(二)

    环境准备 jdk8 安装docker 镜像加速器配置 docker私有仓库 springboot工程的jar包 docker部署项目 dockfile Dockfile是一种被Docker程序解释的脚 ...

  6. [windows bat]如何启动一个新的cmd窗口并在其内执行命令

    两种方式: start cmd /k echo Hello, World! # # 执行完毕以后,新开的窗口不会自动关闭 start cmd /C pause # 执行完毕以后,新开的窗口会自动关闭 ...

  7. /bin/sh^M:解释器错误:没有那个文件或目录

    在win下编辑的时候,换行结尾是\n\r , 而在linux下 是\n,所以才会有 多出来的\rsed -i 's/\r$//' configure 删除configure脚本中的\r

  8. maven多模块和继承

    https://blog.csdn.net/mafan121/article/details/50477852 1.maven 打包Could not resolve dependencies for ...

  9. Windows 10 安装MySQL

    1.下载MySQL官网:https://www.mysql.com/ 进入官网点击DOWNLOADS ->Community->DOWNLOADS (下载社区版) 2.安装MySQL 将下 ...

  10. 20190726_安装CentOS7minimal版本后需要做的优化和配置

    20190726_安装CentOS7minimal版本后需要做的优化和配置 CentOS系统镜像下载地址:https://www.centos.org/ CentOS的Minimal(最小化安装版本) ...