排序

链接

本题考查的就是拓扑排序,由于本题的数据量很少,我们可以直接用邻接矩阵来查重

这题要求输出唯一解,也就是说多解还需要继续输入

我们可以使用bfs,设一个队列q

如果在任何时刻q.size()>1,就意味着存在多解

又或者输出结果(也就是字符串长度)小于n,就意味着出现了环(入度不存在0的情况)

代码如下:

#include<iostream>
#include<vector>
#include<queue>
#include<string>
using namespace std;
int n, m;
vector<vector<bool>>edge(26, vector<bool>(26, 0));
vector<vector<int>>g(26);
vector<int>inge(26,0);

int topo(vector<int>& ans) {
	vector<int>in = inge;
	bool run = 1;
	queue<int>q;
	for (int i = 0;i < n;i++) {
		if (!in[i]) q.push(i);
	}
	while (!q.empty()) {
		if (q.size() > 1) run = 0;
		int cur = q.front();
		q.pop();
		ans.push_back(cur);
		for (int x : g[cur]) {
			if (--in[x] == 0) q.push(x);
		}
	}
	if (ans.size() < n) return -1;
	if (run) return 1;
	return 0;
}

int main() {
	cin >> n >> m;
	for (int i = 0;i < m;i++) {
		char a, opt, b;
		cin >> a >> opt >> b;
		int x = a - 'A', y = b - 'A';
		if (!edge[x][y]) {
			edge[x][y] = 1;
			inge[y]++;
			g[x].push_back(y);
		}
		vector<int>ans;
		int res = topo(ans);
		if (res == -1) {
			cout << "Inconsistency found after " << i + 1 << " relations.";
			return 0;
		}
		else if (res==1) {
			cout << "Sorted sequence determined after " << i + 1 << " relations: ";
			for (int num : ans) {
				cout << (char)(num + 'A');
			}
			cout << ".";
			return 0;
		}
	}
	cout << "Sorted sequence cannot be determined.";
}

时间复杂度:O(m log n)

全部评论
可以的,很好的八股
点赞 回复 分享
发布于 05-06 22:50 北京
题解写的很好
点赞 回复 分享
发布于 04-29 23:21 辽宁
可以的,看着很不错
点赞 回复 分享
发布于 04-29 23:19 北京

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务