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

P1347 排序

image
image

思路:

全序关系+拓扑排序

题目实际上是确认是否存在唯一的全序关系

全序关系唯一 ⟺ 拓扑序唯一 ⟺ 每次 拓扑排序的队列中每时每刻最多有一个元素

(1)合法的情况:

“提示:确定 n 个元素的顺序后即可结束程序,可以不用考虑确定顺序之后出现矛盾的情况”

——需要“加边”与“求拓扑序列”同时进行

——每加一条边,就要求对应的拓扑序列

(2)不合法的情况:

——case1:存在环

1.1 长度>=3的有向回路1.2 长度=2的有向回路(反向边)

——case2:无法确定顺序

加完m条边之后,仍然没有得到唯一的拓扑序/仍然没有触发有环的判断条件,则为无法确定顺序

代码说明

uniq代表unique的含义,表征:

该轮拓扑排序,是否有唯一的拓扑序

indegree数组

统计每一个点的入度.

tmp数组

每次拓扑排序,入度序列都会变化,用tmp数组作为indegree数组变化的替身

数组大小/映射

'A'~'Z':1~26除了边集数组struct edge中的原始字母用char之外,其余均用int

注意点 输入数据时,建议用cin接收

关键点 uniq的必要性

按照“加边”与“求拓扑序列”同时进行的思路,会有一个问题,比如:

image

代码:

#include<bits/stdc++.h>
using namespace std;
struct edge{char u,v;
}e[650]; 
int n,m,indegree[30];//indegree[i]保存字母i的入度数 
vector<int> d[30];//d[i]存字母i出边的终点 
char ch1,symbl,ch2; void toposort()
{char u1,v1,head;bool uniq; int tmp[30]; for(int i=1;i<=m;++i){queue<int> q;vector<int> tp;uniq=true;u1=e[i].u,v1=e[i].v;d[u1-'A'+1].push_back(v1-'A'+1);indegree[v1-'A'+1]++;for(int k=1;k<=n;++k)tmp[k]=indegree[k];for(int k=1;k<=n;++k){if(tmp[k]==0)q.push(k);}while(!q.empty()){if(q.size()>1) uniq=false;head=q.front(); q.pop();tp.push_back(head);		for(auto tail:d[head]){if(--tmp[tail]==0)q.push(tail);}}if(tp.size()<n){//有环 printf("Inconsistency found after %d relations.",i);return ;}if(uniq){//只要有 孤立点/不连通 就不会触发  //只有 连通无回路 含n个元素的全序 才会触发 printf("Sorted sequence determined after %d relations: ",i);for(int k=0;k<n;++k){printf("%c",tp[k]+'A'-1);}printf(".");return ;}}printf("Sorted sequence cannot be determined.");return ;
}int main()
{cin>>n>>m;for(int i=1;i<=m;++i){cin>>ch1>>symbl>>ch2;e[i].u=ch1;e[i].v=ch2;  }toposort();return 0;
} 
http://www.jsqmd.com/news/379288/

相关文章:

  • LangGraph 多 Agent 协同实战教程(非常详细),新闻 AI 审查系统(含源码)!
  • 深度解读.NET中ConcurrentDictionary:高效线程安全字典的原理与应用 - 教程
  • 寒假16
  • Java毕设项目:基于Springboot宿舍报修维护系统(源码+文档,讲解、调试运行,定制等)
  • 【毕业设计】基于springboot的龙岗区在线就业推荐平台的设计与实现(源码+文档+远程调试,全bao定制等)
  • 帆度生物科技(海南)有限公司 联系方式:服务渠道与通用建议参考 - 十大品牌推荐
  • Java计算机毕设之基于Springboot宿舍报修维护系统学生宿舍维修申报与处理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 知识沉淀革命:BERT如何重构测试案例库的智能检索体系
  • 【计算机毕业设计案例】基于springboot的龙岗区在线就业推荐平台Springboot实现的求职推荐系统(程序+文档+讲解+定制)
  • Java计算机毕设之基于Web的留守儿童爱心网站基于springboot的留守儿童关爱网站(完整前后端代码+说明文档+LW,调试定制等)
  • Java毕设选题推荐:基于springboot的龙岗区在线就业推荐平台基于Spring Boot的大学生就业服务平台的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • FeelFish联系方式:选择创作工具时的通用注意事项 - 十大品牌推荐
  • 帆度生物科技(海南)有限公司 联系方式:核心联系渠道及背景简介 - 十大品牌推荐
  • P1381 单词背诵
  • 计算机Java毕设实战-基于SpringBoot的校园食堂美食订餐系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 前端判断文本是否溢出:单行与多行场景的完整解析
  • 安全左移:国产信创DevOps平台的安全(DevSecOps)构建与实践 - 实践
  • Java毕设项目推荐-基于SpringBoot的校园食堂订餐系统校园食堂在线预定下单平台 【附源码+文档,调试定制服务】
  • 计算机Java毕设实战-基于springboot的龙岗区在线就业推荐平台的设计与实现基于Springboot的就业管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Java毕设选题推荐:基于SpringBoot的校园食堂在线预定下单平台 校园食堂订餐系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 帆度生物科技(海南)有限公司 联系方式:如何正确联系及注意事项 - 十大品牌推荐
  • FeelFish官方联系方式:产品功能与使用注意事项说明 - 十大品牌推荐
  • 2026年AEI SCI1区TOP,无人机集群的路径规划与干扰资源分配一体化,深度解析+性能实测
  • 帆度生物科技(海南)有限公司 联系方式:获取官方服务与背景参考 - 十大品牌推荐
  • FeelFish联系方式:官方联系途径及服务指引说明 - 十大品牌推荐
  • Java毕设项目:基于springboot的龙岗区在线就业推荐平台的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 强化学习驱动的防倦怠系统:软件测试任务分配的新范式
  • 帆度生物科技(海南)有限公司 联系方式:使用指南与官方信息参考 - 十大品牌推荐
  • 认识区块链和比特币(二):比特币的交易
  • Java计算机毕设之基于Springboot的就业管理系统的设计与实现基于springboot的龙岗区在线就业推荐平台的设计与实现(完整前后端代码+说明文档+LW,调试定制等)