洛谷 P1347 排序 - 拓扑排序

P1347 排序

题目描述

一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列 \(A,B,C,D\) 表示\(A<B,B<C,C<D\)。在这道题中,我们将给你一系列形如 \(A<B\) 的关系,并要求你判断是否能够根据这些关系确定这个数列的顺序。

输入格式

第一行有两个正整数 \(n,m\)\(n\) 表示需要排序的元素数量,\(2\leq n\leq 26\),第 \(1\)\(n\) 个元素将用大写的 \(A,B,C,D\dots\) 表示。\(m\) 表示将给出的形如 \(A<B\) 的关系的数量。

接下来有 \(m\) 行,每行有 \(3\) 个字符,分别为一个大写字母,一个 < 符号,一个大写字母,表示两个元素之间的关系。

输出格式

若根据前 \(x\) 个关系即可确定这 \(n\) 个元素的顺序 yyy..y(如 ABC),输出

Sorted sequence determined after xxx relations: yyy...y.

若根据前 \(x\) 个关系即发现存在矛盾(如 \(A<B,B<C,C<A\)),输出

Inconsistency found after x relations.

若根据这 \(m\) 个关系无法确定这 \(n\) 个元素的顺序,输出

Sorted sequence cannot be determined.

(提示:确定 \(n\) 个元素的顺序后即可结束程序,可以不用考虑确定顺序之后出现矛盾的情况)

样例 #1

样例输入 #1

4 6
A<B
A<C
B<C
C<D
B<D
A<B

样例输出 #1

Sorted sequence determined after 4 relations: ABCD.

样例 #2

样例输入 #2

3 2
A<B
B<A

样例输出 #2

Inconsistency found after 2 relations.

样例 #3

样例输入 #3

26 1
A<Z

样例输出 #3

Sorted sequence cannot be determined.

提示

\(2 \leq n \leq 26,1 \leq m \leq 600\)

思路

对于每一个排序关系均进行 toposort,后面就是 toposort 判环(出现矛盾),toposort 判顺序,无法确认唯一关系。
详见代码或看洛谷题解区

代码

//>>>Qiansui
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x, y, sizeof(x))
#define debug(x) cout << #x << " = " << x << '\n'
#define debug2(x,y) cout << #x << " = " << x << " " << #y << " = "<< y << '\n'
//#define int long long

using namespace std;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pull;
typedef pair<double, double> pdd;
/*

*/
const int maxm = 2e5 + 5, inf = 0x3f3f3f3f, mod = 998244353;
int n, m, now;
set<int> u;
vector<int> in, rin;
vector<vector<int>> e;

void toposort(int x){
	int ans = 0, sum = 0;
	queue<pii> q;
	string ss;
	for(auto a : u){
		if(in[a] == 0){
			q.push({a, 1});
			++ sum;
		}
	}
	while(q.size()){
		pii u = q.front(); q.pop();
		ans = max(ans, u.second);
		ss += (u.first + 'A');
		for(auto a : e[u.first]){
			-- in[a];
			if(in[a] == 0){
				q.push({a, u.second + 1});
				++ sum;
			}
		}
	}
	if(ans == n){
		cout << "Sorted sequence determined after " << x << " relations: " << ss << ".\n";
		exit(0);
	}
	if(sum != now){
		cout << "Inconsistency found after " << x << " relations.\n";
		exit(0);
	}
	return ;
}

void solve(){
	cin >> n >> m;
	rin = in = vector<int> (n + 1, 0);
	e = vector<vector<int>> (n + 1, vector<int>());
	vector<string> q;
	string ss;
	for(int i = 0; i < m; ++ i){
		cin >> ss;
		q.push_back(ss);
	}
	for(int i = 1; i <= m; ++ i){
		ss = q[i - 1];
		e[ss[0] - 'A'].push_back(ss[2] - 'A');
		u.insert(ss[0] - 'A');
		u.insert(ss[2] - 'A');
		now = u.size();
		++ rin[ss[2] - 'A'];
		in = rin;
		toposort(i);
	}
	cout << "Sorted sequence cannot be determined.\n";
	return ;
}

signed main(){
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int _ = 1;
	// cin >> _;
	while(_ --){
		solve();
	}
	return 0;
}

posted on 2023-07-28 15:17  Qiansui  阅读(59)  评论(0编辑  收藏  举报