首页 > 其他分享 >洛谷 P1347 排序 - 拓扑排序

洛谷 P1347 排序 - 拓扑排序

时间:2023-07-28 15:35:18浏览次数:54  
标签:toposort 洛谷 int long ss vector 排序 P1347

P1347 排序

题意
依次给一些具有排序关系的序列,问你在能否在若干个序列之后确定元素的顺序、判断元素关系存在矛盾、判断无法确认元素顺序

思路
对于每一个排序关系均进行 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;
}

标签:toposort,洛谷,int,long,ss,vector,排序,P1347
From: https://www.cnblogs.com/Qiansui/p/17587708.html

相关文章

  • 3.2 排序 参考代码
    P1059[NOIP2006普及组]明明的随机数计数排序#include<cstdio>inta[1005];intmain(){ intn,cnt=0; scanf("%d",&n); for(inti=1;i<=n;i++){ intx;scanf("%d",&x); if(a[x]==0){//这个数没出现过(第一次出现) a[x]=......
  • 拓扑排序
    拓扑排序给定一张有向无环图,排出所有顶点的一个序列A满足:对于图中的每条有向边(x,y)x在A中的出现都在y之前,则称A是改图的顶点的一个拓扑序。如图所示,{2351746},{3215764}都是合法的拓扑序。用途:可以判断有向图中是否有环,可以生成拓扑排序Kahn算法实现拓扑排序e......
  • P2127 序列排序 题解
    原题题目意思\(有一个数列a,每次可以挑选任意两个元素交换位置,代价为这两个元素的和,问把序列a升序排序所需的最小总代价\)\(定义数列上的一个有i个元素的环S使得s_1要换到s_2,s_2要到s_3,……,s_i要到s_1\)\(原图一个元素只有一个目标位置,所以可以看作一个有n点,n边的有向图\)......
  • C语言快速排序及其优化操作
    快速排序原理简述:找到每一轮最大(最小)的数,依次从左到右存入新的数组,就完成了降序(升序)的排列。#include<stdio.h>intmain(void){intn;scanf("%d",&n);inta[n],temp;for(inti=0;i<n;i++){scanf("%d",&a[i]);}for(......
  • 2023-07-27:最长可整合子数组的长度, 数组中的数字排序之后,相邻两数的差值是1, 这种数组
    2023-07-27:最长可整合子数组的长度,数组中的数字排序之后,相邻两数的差值是1,这种数组就叫可整合数组。给定一个数组,求最长可整合子数组的长度。答案2023-07-27:算法maxLen的过程如下:1.检查输入数组是否为空,如果为空,则返回0,表示最长可整合子数组长度为0。2.初始化长度为1的最长......
  • Java 对json排序
    Java对JSON排序在日常的开发中,我们经常需要将JSON数据进行排序,以满足业务需求或者提高查询效率。本文将介绍如何使用Java对JSON数据进行排序,并提供示例代码帮助理解。什么是JSON?JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,常用于前后端数据传输。它以......
  • P8859 冒泡排序
    我回来了。参考:https://www.luogu.com.cn/blog/_post/509374、https://www.luogu.com.cn/blog/_post/510710。考虑type1,注意到\(1\)是不能被超越的,且一个数操作多次不优,因此第一步操作\(1\)不劣。因此从小到大归位每个数不劣,答案即为总数减去前缀\(\max\)的数目。从小到......
  • linux查询tcp连接数并排序
    查询已连接[root@rabbitmq-1rabbitmq]#netstat-an|awk'{print$5}'|cut-d:-f1|sort|uniq-c|sort-rn3393172.16.229.2532995172.16.47.212400172.16.229.232186172.16.229.254149172.16.229.240102172.16.229.218这个......
  • Java十大经典排序算法汇总
    以下是十大经典排序算法:冒泡排序(BubbleSort):比较相邻两个元素,如果逆序则交换,重复多轮,直到无逆序情况。选择排序(SelectionSort):在待排序元素中选择最小(大)元素,放在已排序序列的起始位置,重复多轮,直到所有元素有序。插入排序(InsertionSort):从第二个元素开始,将每个元素插入到已排序......
  • 后缀排序
    后缀排序本文做复习用,不宜初学用。定义\(sa\)表示排名为\(i\)的位置。\(rk\)表示位置为\(i\)的排名。\(y\)表示按照第二关键字排序排名为\(i\)的位置。\(height\)表示排名为\(i\)和\(i-1\)的后缀的最大前缀\(h\)表示位置为\(i\)和它排名前一位的后缀......