排序

链接

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

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

我们可以使用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)

全部评论

相关推荐

昨天 16:44
我找了个实习,是个初创公司,现在主要人物就两人吧,一个老板一个技术负责人,技术负责人是老板带出来的。老板是9本后面去美国读了硕,好像在美国上过班,后面回国上班在ai部门当头头吧,到24年自己创业,现在因为老板接项目忙不过来了就开始招人了,说五月份有3个实习生,校招社招都在找。我面的是大模型应用开发这个方向。项目的话主要java,还有python做agent例如用openclaw开发。我没怎么学java,对java懂的不多,例如springboot这种框架我也没用过,就本科是ssm做了毕设。薪资跟我说180一天然后有绩效,百分之三十乘以技术负责人打的分,工资一个月一发,绩效说三个月。他是想找能稳定合作的,就是让你一直实习后面转正。然后实习不懂的可以问技术负责人,他说技术负责人非常厉害,但是这个技术负责人他是远程办公的不在公司,因为这个人跟着老板七八年了,老板信任他,然后技术也非常硬,老板现在忙着谈生意,项目的实现主要还是技术负责人。跟我说了三个项目吧,一个纯java的,还有一个用openclaw开发法律助手,还有一个无人机什么的,那个感觉是java加深度学习视觉检测的。他说往全栈发展,就是啥都要会,前端后端agent啥啥啥的。暂时能回忆到的就这些,信息太多了大家觉得怎么样?要不要去?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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