首页 > 其他分享 >P1347 排序

P1347 排序

时间:2024-05-14 10:34:48浏览次数:22  
标签:knum 排序 return int rd include P1347 kid

链接:https://www.luogu.com.cn/problem/P1347
题目:

由于数据量很小,所以可以在线处理数据。
首先判断有没有环(这里不一定可以根据拓扑排序写出来,因为有的环可以只有部分节点,所以必须遍历所有节点的路径,判断有没有环);
然后查看入度为0的点,如果没有环而且入度为0的点多于1个,那么就是无法确定,如果没有点那么显然就是一个环,上一步可以判断出来。
如果只有一个,那么判断能不能排序,就是拓扑排序能不能走到底。
代码:

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
typedef long long ll;
using namespace std;
const int N = 30; int n;
int rd[N]; vector<int>G[N];
int rd_tem[N];bool vis[N];bool jd = true;
void dfsk(int id);
bool hasroll(int n)
{
	
	memset(vis, 0, sizeof(vis));
	for (int i = 1; i <= n; i++)
	{
		dfsk(i);//dfsk,true::有环
	}
	return jd;
}

void dfsk(int id)
{
	vis[id] = true;
	if (jd)return;
	for (int u : G[id])
	{
		if (vis[u])
		{
			jd = true; return;
		}
		if (jd)return;
		dfsk(u);
	}
	if (jd)return;
	vis[id] = false;
}
int dfs(int id, queue<int>*q)
{
	if (q->size() == n)return 0;
	int knum = 0; int kid = 0;
	for (int i = 0; i < G[id].size(); i++)
	{
		int v = G[id][i];
		rd_tem[v]--;
		if (!rd_tem[v]) { knum++; kid = v; }
	}
	if (knum > 1)return 3;
	if (knum == 0)return 1;
	q->push(kid);
	return dfs(kid, q);
	
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int m;
	cin >> n >> m;
	for(int i=1;i<=m;i++)
	{
		string s; cin >> s;
		if(s[0] == s[2])
		{
			cout << "Inconsistency found after " << i << " relations.";
			return 0;
		}
		G[s[0] - 'A'+1].push_back(s[2] - 'A'+1);
		rd[s[2] - 'A'+1]++;
		int numofzero = 0; int zeroid = 0;
		for (int i = 1; i <= n; i++)
			if (!rd[i])
			{
				numofzero++;
				zeroid = i;
			}
		if (!numofzero)
		{
			cout << "Inconsistency found after " << i << " relations.";
			return 0;
		}
		jd = false;
		if(hasroll(n))
		{
			cout << "Inconsistency found after " << i << " relations.";
			return 0;
		}
		if (numofzero > 1 )
			continue;
			
		//环 or 线
		for (int i = 1; i <= n; i++)rd_tem[i] = rd[i];
		queue<int>ans;
		ans.push(zeroid);
		int jd = dfs(zeroid,&ans);
		
		if (jd == 1)//环,直接跳
		{
			cout << "Inconsistency found after " << i << " relations.";
			return 0;
		}
		else if (jd == 0)//线,肯定行
		{
			cout << "Sorted sequence determined after " << i << " relations: ";
			while (!ans.empty()) { char s='A' + (ans.front() - 1); cout << s; ans.pop(); }
			cout << '.';
			return 0;
		}
	}
	cout << "Sorted sequence cannot be determined.";
	return 0;
}

标签:knum,排序,return,int,rd,include,P1347,kid
From: https://www.cnblogs.com/zzzsacmblog/p/18190739

相关文章

  • MySQL 中 FIELD() 自定义排序
    在MySQL中,你可以使用ORDERBYFIELD()来自定义排序顺序。这个函数允许你指定字段的自定义排序顺序,而不是默认的升序或降序排序。以下是一个简单的例子:假设你有一个表格叫做products,其中有一个字段叫做category,你想按照特定的类别顺序进行排序,比如'Electronics','Clothing......
  • MySQL数据高阶处理技巧:掌握先排序后分组的智慧
    在MySQL数据库的数据探索旅程中,排序和分组是不可或缺的工具。然而,当你面对大量数据、重复值等情况时,常规的处理方法可能显得不够灵活。本文将为你揭示一个精妙的技巧:如何在MySQL中先排序,后分组,从而获取每个类型的最新数据,助你轻松驾驭复杂的数据处理任务。 问题背景:先排序,后分......
  • JAVA Comparator 自定义排序 源码分析
    对于一个数组来说如果我们想要从大到小排序一般会这么写Integer[]nums={1,2,3};Arrays.sort(nums,newComparator<Integer>(){@Overridepublicintcompare(Integera,Integerb){returnb-a;}});......
  • 【拓扑排序】【DFS】课程表
    题源解法1DFS思路:最先被放入栈中的节点是在拓扑排序中最后面的节点一开始用了DFS,但是出现了问题DFS函数在正确处理循环检测方面存在问题:循环检测逻辑问题:在您的DFS中,您检查一个课程是否已被访问,如果已被访问,则立即将valid设置为False。这种方式并没有正确区分处于当前路......
  • 【Python】模拟windows文件名排序(自动处理文件名中有数字类型排序)
    实现了一种模拟windows排序的python方法,其排序规则为:不处理浮点数特殊字符(如:&、$、#等)排在数字和字母之前;数字优先于字母排序;数字是连着的整数,应该按照整数进行排序;小写字母排在大写字母前面;英文字符按字母表顺序排序; defcustom_sort_key(str_value):digita......
  • HTML5 参考手册(字母排序)
    标签描述<!--...-->定义注释<!DOCTYPE>定义文档类型<a>定义超文本链接<abbr>定义缩写<acronym>定义只取首字母的缩写,不支持HTML5<address>定义文档作者或拥有者的联系信息<applet>HTML5中不赞成使用。定义嵌入的applet。<area>定义图像映......
  • 梦熊四月 csp-s 模拟赛2 T2 排序
    小B想要对一个长为\(n\)的序列\(A\)排序。已知\(A\)中只包含\(0,1,\cdots,n-1\)且对任意\(i\nej\)有\(A_i\neA_j\)且\(n\)为\(2\)的次幂。为了排序,小B只想用以下两种操作:交换相邻的两个位置,也就是说选择\(1\lei\len-1\)并且交换\(A_i,A_{i+1}\)。......
  • 洛谷 P2824 [HEOI2016/TJOI2016] 排序(二分,线段树)
    传送门解题思路据说是经典思路:把多次排序转化成二分+01序列。首先二分所求位置的数字是啥,将大于mid的数字变成1,将小于等于mid的数字变成0。这样在排序的时候就相当于统计区间里的1的个数(区间和),然后区间全部变成0或者1。也就是区间修改,区间求和,线段树可以实现。AC代码#inclu......
  • 自定义各类基础排序算法
    接口函数基础信息/********************************************************************* 文件名称: 数据结构中对于无序数列的排序算法* 文件作者:[email protected]* 创建日期:2024/05/11* 文件功能:对无序数列进行排序* 注意事项:None** C......
  • 加练日记2-二分,双指针,排序
    二分模板 #include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constllMOD=998244353;lln,m;constllN=2e5+9;lla[N];llv[N];intf(llmid){ llans=0,pre=-1e9; for(inti=1;i<=n;i++){ if(a[i]-pre>=mid)ans++,pre=a[i......