当前位置: 首页 > news >正文

洛谷——P1347 排序(图论-拓扑排序)

文章目录

  • 一、题目
  • 排序
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
    • 样例 #3
      • 样例输入 #3
      • 样例输出 #3
    • 提示
  • 二、题解
    • 基本思路:
    • 代码


一、题目

排序

题目描述

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

输入格式

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

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

输出格式

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

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

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

Inconsistency found after x relations.

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

Sorted sequence cannot be determined.

(提示:确定 n n 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 ≤ n ≤ 26 , 1 ≤ m ≤ 600 2 \leq n \leq 26,1 \leq m \leq 600 2n26,1m600

二、题解

基本思路:

  • 很明显这是一道拓扑排序的题,基本是是个模板题,考察的是对拓扑排序得理解。
  • 输出结果有三种,再每次输入一对关系后进行拓扑排序判断
  • 一:拓扑序列结果为n个元素且最长链也得是n
  • 二:图中不能有环,有环即存在矛盾。而拓扑排序可以判断一个图中有没有环,当拓扑序列的长度不是已读入元素的个数时,说明有环。
  • 三:在输入m个关系后,前俩个都不是,说明还没确定关系

代码

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long
#define fi first
#define se second
#define repn(i,o,n) for(int i=o;i<=n;i++)
#define rep(i,o,n) for(int i=o;i<n;i++)
const int N = 30;
int n,m,d[N],rd[N];
vector<int> edge[N];
set<char> b;//存放当前读入的元素,用count函数来判断有没有读入 
bool flag=false;//还没找到答案 
//1.拓扑序列结果为n个元素且最长链也得是n 
//2.图中不能有环,有环即存在矛盾
//3.在输入m个关系后,拓扑序列的结果!=n inline void TopoSort(int num){queue<pair<int,int>> q;//第一个参数存得是点,第二个是以该节点为结尾得链得长度 vector<int> ans;//存放拓扑序列 int maxn=0;//找最长链 repn(i,1,n)//入度为0的点且已经读入了该点的点入队 if(!rd[i]&&b.count((char)(i+'A'-1))) q.push({i,1});while(!q.empty()){auto x=q.front();q.pop();ans.push_back(x.fi);//拓扑序列每个节点出队一次 for(auto y:edge[x.fi])if(--rd[y]==0){q.push({y,x.se+1});maxn=max(maxn,x.se+1); //找到最长链 }}if(maxn==n){//最长链为n个元素说明已经确定了n个元素的顺序 cout<<"Sorted sequence determined after "<<num<<" ";cout<<"relations: ";rep(i,0,ans.size()){cout<<(char)(ans[i]+'A'-1);//输出拓扑序列 }cout<<'.'<<endl;//!!!注意还得输出个'.' flag=true; return ;}//cout<<ans.size()<<endl;if(ans.size()!=b.size()){cout<<"Inconsistency found after "; cout<<num<<" relations."<<endl;flag=true;return ;}
}void solve() {cin>>n>>m;repn(i,1,m) {string s;cin>>s;b.insert(s[0]),b.insert(s[2]);edge[s[0]-'A'+1].push_back(s[2]-'A'+1);++d[s[2]-'A'+1];repn(i,1,n)rd[i]=d[i];TopoSort(i);if(flag) return ;if(i==m){//i==m时,前两个都不是,说明还没确定关系 cout<<"Sorted sequence cannot be determined."<<endl;}}}signed main() {//IOS;int T=1;//cin>>T;while(T--) {solve();}return 0;
}
http://www.lryc.cn/news/274260.html

相关文章:

  • JVM内存管理
  • 将 Python 和 Rust 融合在一起,为 pyQuil® 4.0 带来和谐
  • Spring Boot应用程序中VO的理解及使用
  • 华为交换机ETH-TRUNK链路聚合lacp模式与手工模式
  • 函数图像化
  • gnu工程的编译 - 以libiconv为例
  • 在 CentOS 7.8 上安装 Node.js
  • 【数据分析实战】冰雪大世界携程景区评价信息情感分析采集词云
  • BIND-DNS配置介绍
  • Python技巧
  • 几种常见的CSS三栏布局?介绍下粘性布局(sticky)?自适应布局?左边宽度固定,右边自适应?两种以上方式实现已知或者未知宽度的垂直水平居中?
  • 箭头函数 - JavaScript的新宠儿
  • 操作系统期末复习知识点
  • [英语学习][23][Word Power Made Easy]的精读与翻译优化
  • 吉林大学19、21级计算机学院《计算机网络》期末真题试题
  • python练习3【题解///考点列出///错题改正】
  • LINUX服务器防火墙nf_conntrack问题一例
  • 经典八股文之RocketMQ
  • Pandas之从sql库中导入数据的几种方法分析
  • 18. Mysql 存储过程,实现动态数据透视
  • VuePress部署到GitHub Pages
  • git 本地仓库
  • Hive实战:分科汇总求月考平均分
  • 快速搭建知识付费小程序,3分钟即可开启知识变现之旅
  • 【计算机图形学划重点】第一讲-Pipeline and Introduction
  • 面试题-DAG 有向无环图
  • vite + vue3引入ant design vue 报错
  • 使用EasyPoi导入数据并返回失败xls
  • 机械配件移动商城课程概述
  • prometheus-docker 快速安装