博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1285 确定比赛名次
阅读量:6323 次
发布时间:2019-06-22

本文共 860 字,大约阅读时间需要 2 分钟。

//拓扑排序裸题,题目要求按编号从小到大输出,要换一种思维去思考

//按照数据结构课本的算法,建立邻接表,用栈实现。初始化先将入度为0的顶点入栈,然后以栈顶顶点为准,先将栈顶顶点出栈输出它的信息,然后扫描它的邻接表,没找到一个弧头就将其入度减1,减1后判断该弧头是否入度为0,是的话就入栈。直到所有顶点都出栈那么就输出了一个拓扑序列。但是这样做不能保证编号从小到大输出

  为了保证从小到大输出,要用“每次都从头来过”的思想,因为题目保证一定存在拓扑序列,所以对于n个点,一定输出n次,所有外循环是次数,找到了n次,输出n个点,然后每次找,都是按照编号从1找到n,所以内循环是对应顶点的编号,从1到n,从当找到一个顶点,还没有纳入拓扑序列并且入度为0,就输出这个顶点的信息,并且扫描它的邻接表,将所有的弧头的入度都减1,然后再从头找过

所以找了n次,从次都是从编号1到n地扫描所有顶点,这样就能保证拓扑序列的正确性,而且因为编号都是从小到大扫描的,那么保证了先输出了编号小的

 

//用数组来实现邻接表 #include 
#include
#define MAXN 510#define MAXM 250100bool g[MAXN][MAXN],vis[MAXN]; //g对应边集数组,体重可能有重复,vis记录那些顶点已经纳入序列int u[MAXM],v[MAXM]; //保存弧u->vint first[MAXN]; //对应每个顶点的邻接表的第一条弧的编号int in[MAXN]; //对应每个顶点的入度int nextt[MAXM]; //对应一条弧的下一弧的编号int n,m;void input(){ int i,j,k; memset(first , -1, sizeof(first)); memset(in,0,sizeof(in)); memset(g,0,sizeof(g)); for(i=0; i

转载地址:http://cclaa.baihongyu.com/

你可能感兴趣的文章
恢复低版本的FlashPlayer
查看>>
Opengl VS2008开发环境
查看>>
ylbtech-QQ(腾讯)-群空间-数据库设计
查看>>
面试书籍
查看>>
T-SQL:SQL Server-数据库查询语句基本查询
查看>>
spring的jar包maven地址,统一下载很方便
查看>>
剑指 offer set 22 数组中的逆序数
查看>>
Spring MVC 学习 之 - 配置简单demo
查看>>
挂羊头卖狗肉蓄意欺骗读者——谭浩强《C程序设计(第四版)》中所谓的“按照C99”(一)...
查看>>
Java Split以竖线作为分隔符
查看>>
编程习惯
查看>>
Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File
查看>>
Mysql log_slave_updates 参数
查看>>
模式识别 - 处理多个演示样本研究(MIL)特点(matlab)
查看>>
lintcode :Remove Duplicates from Sorted Array II 删除排序数组中的重复数字 II
查看>>
CSS 简介
查看>>
atitit.短信 验证码 破解 v3 p34 识别 绕过 系统方案规划----业务相关方案 手机验证码 .doc...
查看>>
C# TextBox常用方法总结
查看>>
[android] 调用系统照相机和摄像机
查看>>
JDBC数据库编程常用接口(转)
查看>>