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 ...
随机推荐
- Elasticsearch Java Rest Client简述
ESJavaClient的历史 JavaAPI Client 优势:基于transport进行数据访问,能够使用ES集群内部的性能特性,性能相对好 劣势:client版本需要和es集群版本一致,数据序 ...
- nginx 日志打印响应时间 request_time 和 upstream_response_time
设置log_format,添加request_time,$upstream_response_time,位置随意 og_format main '"$request_time" ...
- 如何在 Apache Hive 中解析 Json 数组
我们都知道,Hive 内部提供了大量的内置函数用于处理各种类型的需求,参见官方文档:Hive Operators and User-Defined Functions (UDFs).我们从这些内置的 ...
- linux查找历史命令
1.ctr+r 输入搜索关键词 2.&history 3.上箭头翻看
- springboot vue前后端分离 跨跨域配置
public class CustomCorsFilter extends OncePerRequestFilter { @Override protected void doFilterIntern ...
- 【GMT43智能液晶模块】例程二十:LAN_DNS实验——域名解析
源代码下载链接: 链接:https://pan.baidu.com/s/16EW6AYpHpXljmBdNvMJM7g提取码:6lyk 复制这段内容后打开百度网盘手机App,操作更方便哦 GMT43购 ...
- java js ur特殊格式处理 json 特殊格式处理
url特殊格式处理: js中使用 encodeURIComponent() 编码对应的value $.ajax({ type: "post", url: "/tb_are ...
- H3C 开局设置
简介: 系统菜单 即 [H3C] 模式 一:恢复出厂设置 这个没什么说的,必须Console连接. 连上以后,在启动时Ctrl+B,进入管理启动菜单,删除文件,删除配置文件然后重启即可. Ctrl+ ...
- jstree: 获得根节点,checkbox事件处理
$.jstree.defaults.core.themes.responsive = true; $.jstree.defaults.checkbox.three_state = false;// 如 ...
- Appium脚本(4) 使用uiautomator方法定位元素
from app.find_element.capability import driver from time import sleep # 使用uiautomator方法定位元素 accunt_i ...