POJ 1094

掌握拓扑排序算法:POJ1094实践指南 简介:拓扑排序是处理有向无环图(DAG)中顶点依赖关系的排序方法,在数据结构和算法中有着重要应用。POJ1094题目要求实现一个拓扑排序的解决方案,涵盖了算法的步骤和数据结构的使用。本文将引导读者通过POJ1094实践,理解如何构建邻接表,计算入度,并运用DFS或BFS方法完成拓扑排序,并处理可能遇到的环路问题。 阅读详情


说明:代码学习于优秀的网友,注释是我写的  ,如果哪里有错误  ,欢迎指正

POJ 1094:题意:有一些未知数各不相等,给出一些两两比较的大小关系,问到第几个关系开始可以确定整体排序或出现矛盾,再或者所有关系都用过了也无法确定整体排序。


拓扑排序 的思想: 从图中取一个没有前驱的顶点输出,  从有向图中删去此顶点以及所有以它为尾的弧 。 要求是有向无环图,图中顶点是线性排列关系

邻接矩阵(用数组存储图的方式):采用两个数组,一个数组用来存储顶点信息   另一个数组用来存储数据元素之间的关系

一般如下定义:

map[max][max];

for(int i;i<m;i++)//m,n根据自己的需要来确定

{

     for(int j;i<n;j++)

          {

           }

}

-----------------------------------------------------------------------------------------------------------------------------------------------

#include<iostream>
#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<cstring>
#include<string.h>
#include<algorithm>
using namespace std;

#define  maxn  30   //宏定义
int n, m; //分别代表顶点数和边数
bool smaller[maxn][maxn];//用来存储最后拓扑顺序的结果
enum Result   //枚举结果的类型
{
 inconsistent, determined, undetermined  //分别代表有矛盾的   确定的, 不确定的
};

int get_id(char a)//把ASC码值转换成数值
{
 return a - 'A';
}

Result  work(int a, int b)
{
 int i,j;
 if (smaller[b][a])//如果现在输入的值在存储结果的数组中已经存在,则是结果为矛盾
 {
  return  inconsistent;
 }
 smaller[a][b]=true;//不然就把该条件输入到结果中进行排序
 for (i = 0; i <n; i++)//对结果数组中的顶点进行判断,确定顶点
 {
  if (smaller[i][a])
  {
   smaller[i][b] = true;
  }
 }
 for ( i = 0; i <n; i++)
 {
  if (smaller[b][i])
  {
   smaller[a][i] = true;
  }
 }
 for ( i = 0; i <n; i++)//根据条件确定顶点之间的关系
 {
  for ( j = 0; j < n; j++)
  {
   if (smaller[i][a] && smaller[b][j])
   {
    smaller[i][j] = true;
   }
  }
 }
 for ( i = 0; i < n; i++)
 {
  for ( j = i+1; j < n; j++)
  {
   if (!(smaller[i][j]||smaller[j][i]))
   {
    return  undetermined;
   }
  }
 }
 return  determined;  //如果根据已知的条件得到了结果,返回已确定答案
}

void  input(int x) 
{
 char st[5];
 for (int i = x + 1; i < m; i++)
 {
  gets(st);
 }
}

bool cmp(int a, int b)
{
 return smaller[a][b];
}

void output()
{
 int f[maxn];
 int i;
 for ( i = 0; i < n; i++)
 {
  f[i] = i;
 }
 sort(f, f + n, cmp);
 for(i = 0; i < n; i++)
 {
  putchar(f[i] + 'A');
 }
}


int main()
{
 while (scanf("%d%d",&n,&m),n|m)  //输入顶点数跟给出的条件的个数
 {
  int i;
  getchar();  //得到字符
  memset(smaller, 0, sizeof(smaller));//对用来存储结果的数组清空
  Result ans = undetermined;  //定义一个结果的对象
  for ( i = 0; i <m; i++)
  {
   char a, b, opr;
   a = getchar();//用来获取输入的第一个条件的字符
   opr = getchar();//用来获取输入的第二个条件的字符
   b = getchar();//用来获取输入的第三个条件的字符
   getchar(); //用来接收空格
   if (opr == '<') //如果满足条
   {
    ans = work(get_id(a),get_id(b));//调用work函数,及get_id,得到某种结果
   }
   else
   {
    ans = work(get_id(b), get_id(a));
   }
   if (ans==inconsistent)//根据返回的结果进行相应格式的输出
   {
    printf("Inconsistency found after %d relations.\n", i + 1);
    input(i);//用来得到顶点数
    break;
   }
   if (ans==determined)
   {
    printf("Sorted sequence determined after %d relations: ", i + 1);
    input(i);
    output();
    cout << "." << endl;
    break;
   }
  }
  if (ans==undetermined)
  {
   puts("Sorted sequence cannot be determined.");
  }
 }
 system("pause");
 return  0;
}

深入解析POJ1094:优化排序算法实战 递归是一种编程技术,它允许一个函数调用自身。递归的基本思想是将问题的规模缩小,并将问题简化为更小的、相同的问题,再通过递归调用自身来解决这些更小的问题,直到达到最简单的情况(递归基)。递归函数包含两个主要部分:递归基(Base Case):为问题提供一个已知的解决方案,防止无限递归。递归体(Recursive Case):函数调用自身解决问题的一部分,并将结果合并来解决整个问题。通过本章的介绍,我们深入了解了递归技术在排序算法中的应用。 阅读详情

相关推荐

poj1094 拓扑排序

NULL 博文链接:https://200830740306.iteye.com/blog/603488

POJ 1094 (传递闭包 + 拓扑排序)

题目链接: POJ 1094 题目大意:有 1 ~ N 个大写字母,且从 A 开始依次 N 个。再给你 M 个小于的关系,比如 A < B ,让你判断三种可能: 1、在第 i 个关系罗列之后,是否可以满足使得这 N 个字母能递增关系。 2、在第 i 个罗列之后,是否会出现矛盾,例如 A > B,而在第 i 个状态出现后,B > A ,故矛盾。 3、如果 M...

diefen9380的博客 395

【论文阅读笔记】One Shot 3D Photography

论文主页:https://facebookresearch.github.io/one_shot_3d_photography/ 代码地址:https://github.com/facebookresearch/one_shot_3d_photography   该3D照片方向,由于刚入门,所以会倾向于翻译文章。每个操作上的选择,及为什么不进行另外操作的原因都如数放上。 论文小结   本作的工作是从单张RGB图片生成一个移动视角的3D照片。   其管道大致如下: 由RGB图像通过单目深度估计网络估计深度图

时光机 °的博客 1839

poj 1094

Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22726   Accepted: 7859 Description An ascending sorted sequence of distinct values is one

sdjzujxc的专栏 1060

保姆级教程:用Python和PyTorch复现PTB-XL心电信号分类论文(附完整代码)

本文提供了一份详细的PTB-XL心电信号分类教程,涵盖从数据预处理到模型优化的完整流程。通过PyTorch实现三种深度学习架构(Conv1D、SincNet和熵特征融合网络),并针对医疗AI特有的类别不平衡问题提供解决方案。教程包含可运行的代码示例,帮助开发者快速复现论文结果并应用于实际心电信号分析场景。

weixin_30555125的博客 405

智慧矿山无人机空地一体化解决方案

未来,随着技术的不断进步和应用场景的不断拓展,智慧矿山无人机空地一体化解决方案将在矿业领域发挥更加重要的作用,为矿山的可持续发展提供更加有力的保障。该系统能够实现矿山的全方位、全天候监测与管理,提升矿山生产效率,降低安全风险,并为矿山的可持续发展提供有力支持。智慧矿山无人机空地一体化解决方案是当前矿业领域技术创新的重要方向,旨在通过集成无人机技术、物联网、大数据、人工智能等先进技术,实现矿山的智能化、高效化和安全化运营。在矿山爆破、挖掘等危险作业中,无人机可进行远程监控和指挥,降低人员安全风险。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 1110

POJ1094(拓扑排序)

POJ1094(拓扑排序) Sorting It All Out Description An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that

shui2104的博客 369

【深度学习新浪潮】李飞飞团队VAGEN框架深度解析:让VLM智能体学会“三思而后行“

VAGEN框架的真正价值,不仅在于性能指标的突破,更在于重新定义了VLM智能体的发展方向——人工智能的进步不应只追求"做得对",更要实现"想得清"。李飞飞团队通过强制显式思考、动态表示适配和精细化奖励三大创新,让智能体第一次具备了可解释的世界建模能力。正如人类通过"观察-预测-行动"认识世界,VAGEN为AI注入的这种思考范式,或许正是通往通用人工智能的关键一步。对于开发者而言,开源的VAGEN框架不仅提供了强大的工具,更揭示了一个重要理念:让AI学会思考,比让它学会执行更重要。

专注:太空算力、AI infra、异构调度、大模型成本工程 280

POJ1094Sorting It All Out题解

有环的优先级大于无序的优先级。

weixin_42178241的博客 276

【QT开发教程】使用Qt进行NFC编程

近场通信(NFC,Near Field Communication)技术广泛应用于现代设备中,例如智能手机、支付终端和门禁系统。Qt提供了一套完整的NFC模块,使开发者可以轻松地在应用程序中实现NFC功能。本文将介绍如何在Qt中进行NFC编程,包括基本概念、使用方法以及一些实际的示例。

科技改变人类,技术成就未来 1469

YOLO11 改进、魔改|分组残差自注意力GRSA,通过分组残差优化 QKV 计算、指数空间映射优化位置偏差,在大幅降低自注意力模块参数和计算量的同时,增强特征关系与位置信息的表征能力

【摘要】研究人员提出GRSA(分组残差自注意力)机制,解决Transformer在图像超分辨率任务中效率与性能难以兼顾的问题。GRSA通过分组残差层减少自注意力参数冗余,同时采用指数空间相对位置偏差优化位置信息表征。实验表明,GRSA在降低50%参数量的同时保持模型性能,适用于目标检测和图像分割任务。在YOLO系列模型中集成GRSA可提升小目标检测精度,代码实现已开源,详细部署教程见相关视频与GitHub资源。该机制为轻量化Transformer模型提供了高效解决方案。

qq_64693987的博客 798

POJ1094

题目链接:http://poj.org/problem?id=1094 解题思路:   思路来源于网络。   唉,说到底对于图论的理解还是太浅了。   A<B可以看成A-->B,这样就不难把问题转换成一个拓扑排序了。把每一个不等式看成一条边,逐一往图中加边,每加入一条边检查一次。   1、建一个队列,像 bfs 那样,让所有入度为 0 的点入队。对于每一个入度为 0...

dielie6462的博客 115

iStoreOS等软路由插件卸载的残留?分享一款软路由高级卸载工具,自定义卸载,轻松解决卸载残留问题

iStoreOS用户看过来!👀 还在被插件包残留困扰吗?本文分享一款“高级卸载”的插件,助你深度清理iStoreOS系统,彻底解决软件卸载不净的痛点,告别频繁恢复出厂设置的烦恼!🚀

XiaoqiangClub的博客 1544

POJ 1094解题报告

POJ 1094解题报告这个题主要的是使用拓扑排序,相关算法随便找一本算法的书都能看到,也不难,就不罗嗦了。我使用邻接表来保存图,并使用dm,dn分别保存每个节点(即字母)的出度和入度。我只想强调一下需要注意的:一、先判断是否有环路        我就是一开始在检测到不能确定序列的时候就直接返回了,而没有判断是否有环路,结果一直WA;二、当序列可以确定或是检测到环路的时候,

351

YOLOv12模型详解及代码复现

YOLOV12算法详解及Python代码复现

hasakie的博客 6488

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

POJ1094拓扑排序

POJ1094拓扑排序 题目分析 http://poj.org/problem?id=1094 本题给出AOV活动网络的一个拓扑排序问题,要求给出:唯一的一个拓扑序列 || 拓扑序列不唯一 || 不存在拓扑序列(不一定是存在环),并指出使用了所有关系中的前几个得到了以上三个结论中的一个 拓扑排序的基本思想,循环执行以下两步直到不能执行为止: (1) 选择一个入度为0的顶点并输出之; (2)...

qq_43513855的博客 230

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

POJ 1094(TopoSort)

POJ 1094 题意:该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列。是典型的拓扑排序,但输出格式上确有三种形式:      1.该字母序列有序,并依次输出;      2.该序列不能判断是否有序      3.该序列字母次序之间有矛盾,即有环存在。 但是注意顺序,必须要先判断环,其次是无序,最后才是有序。 #include #include

Since_natural_ran 397

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

拓扑排序POJ1094

题目:POJ1094 大意:对于N个大写字母,给定它们的一些偏序关系,要求判断出经过多少个偏序关系之后可以确定它们的排序或者存在冲突(有环存在,如A 利用拓扑排序即可解决这个问题,但由于题目要求的是经过多少个关系之后就可以确定答案,因此每读入一个关系,就要进行一次拓扑排序。 如果某一次拓扑排序之后可以确定它们的唯一排序或者发现冲突存在,则后面的直接略过。 如果读入所有关系之后依然无法确定唯

zhuma的编程学习 661

POJ 1094拓补排序

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

Accelerato的博客 200

[POJ 1094] Sorting It All Out

[题目链接] http://poj.org/problem?id=1094 [算法] floyed传递闭包 [代码] #include <algorithm> #include <bitset> #include <cctype> #include <c...

99

poj 1094(拓扑排序)

http://poj.org/problem?id=1094 题意:给你m个字母,有n个判断语句。求在哪个语句就可以判断出这个是不是一个环,或者在哪个语句可以判断出这些字母的排序规则,或者就是不能确定。 思路:每输入一次,进行一次排序,看会不会构成环或者已经可以确定了判断规则。 1 #include <stdio.h> 2 #include <st...

A1823085974的博客 157

POJ 1094 Sorting It All Out 已被翻译

woniupengpeng的专栏 355

POJ 1094 Sorting It All Out

POJ1094-Sorting It All Out 原题地址 参考链接 poj1094 zhengnanlee 这题做的真是心碎,做了好几个小时就是不知道哪里错了。后来上网查了一下,发现这题的判断顺序和我想象中的不一样。。。。我以为是先从头到尾先判断是否有矛盾完了之后再来拓扑排序。结果这道题目是每读入一个数据就进行判断: 到目前为止的输入是否构成矛盾 到目前为止的输入是否可以推断出

czx111331的博客 339

G - Sorting It All Out POJ - 1094

G - Sorting It All Out  POJ - 1094  An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For exam...

nucleare的博客 276

poj 1094 Sorting It All Out(拓扑排序)

http://poj.org/problem?id=1094 拓扑排序,有点坑。。 给出m个关系,在输入的同时判断在当前条件下是否有环,是否能形成唯一拓扑序列,或者是不确定。 此题要注意优先级,当在输入的过程中出现环或拓扑排序成功时可以直接输出,但当前驱结点不唯一时不能直接输出,因为后面的输入可能导致出现环,这时候就应该输出矛盾而不是拓扑序列不唯一了,所以判拓扑序列不唯一时应放在输入完毕

2059
上一篇: poj 2367
下一篇: POJ 1144
帅帅索大
博客等级 码龄10年 26粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值