P1347 排序(拓扑排序)
题目传送门:https://www.luogu.com.cn/problem/P1347
拓扑排序模板题,第一种情况是求这张图拓扑排序之后是否为n个点,也就是说,这张图必须无环,而且有且仅有一个点的入度为0,第二种情况是求图中是否存在环,第三种情况就是如果在m次建边之后无法得到前两种情况直接输出就可以了。由于数据规模极小,可以一边建边一边拓扑排序。
代码:
1 #include<iostream>
2 #include<cstdio>
3 #include<algorithm>
4 #include<vector>
5 #include<map>
6 #include<queue>
7 #include<set>
8 #include<cmath>
9 #include<list>
10 #include<cstring>
11 #include<string>
12 #define ll long long
13 #define ull unsigned long long
14 #define inf 0x3f3f3f3f
15 #define inff 0x7fffffff
16 using namespace std;
17 const int N = 100000 + 10;
18
19 struct node {
20 int to, w, next;
21 }e[N << 2];
22 int head[N << 2];
23 int tot;
24
25 void add(int u, int v) {
26 e[tot].to = v;
27 e[tot].next = head[u];
28 head[u] = tot++;
29 }
30
31 vector<int>topo;
32 int c[N], n, m;
33
34 bool dfs(int u) {
35 c[u] = -1;
36 for (int i = head[u]; i + 1; i = e[i].next) {
37 int v = e[i].to;
38 if (c[v] < 0)
39 return false;
40 else if (!c[v])
41 if (!dfs(v)) return false;
42 }
43 c[u] = 1;
44 topo.push_back(u);
45 return true;
46 }
47
48 int cnt = 0;
49 int toposort() {
50 cnt = 0;
51 topo.clear();
52 memset(c, 0, sizeof(c));
53 for (int u = 1; u <= n; u++) {
54 if (!c[u]) {
55 if (!dfs(u)) {
56 return 0;
57 }
58 else {
59 cnt++;
60 }
61 }
62 }
63 reverse(topo.begin(), topo.end());
64 if (cnt > 1) return 2;
65 if (cnt == 1) return 1;
66
67 }
68
69 map<int, map<int, int>>mp;
70
71 int main() {
72
73 cin >> n >> m;
74 memset(head, -1, sizeof(head));
75 for (int i = 1; i <= m; i++) {
76 string s;
77 cin >> s;
78 if (s[1] == '<') {
79 if (!mp[s[0] - 'A' + 1][s[2] - 'A' + 1]) {
80 add(s[0] - 'A' + 1, s[2] - 'A' + 1);
81 mp[s[0] - 'A' + 1][s[2] - 'A' + 1] = 1;
82 }
83 }
84 else {
85 if (!mp[s[2] - 'A' + 1][s[0] - 'A' + 1]) {
86 add(s[2] - 'A' + 1, s[0] - 'A' + 1);
87 mp[s[2] - 'A' + 1][s[0] - 'A' + 1] = 1;
88 }
89 }
90 int op = toposort();
91 if (op == 1) {
92 //cout << i << "a\n";
93 cout << "Sorted sequence determined after " << i << " relations: ";
94 for (int i = 0; i < topo.size(); i++) {
95 cout << char(topo[i] - 1 + 'A');
96 }
97 cout << ".\n";
98 return 0;
99 }
100 else if (op == 0) {
101 //cout << i << "b\n";
102 cout << "Inconsistency found after " << i << " relations." << "\n";
103 return 0;
104 }
105 else {
106 //cout << i << "c\n";
107 continue;
108 }
109 }
110 cout << "Sorted sequence cannot be determined.\n";
111
112 return 0;
113 }
永远热爱,永远向着光。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?