求这类图工具

查看: 846|回复: 6
帖数342 个收听数个人主页精华0听众数相册帖子分享日志好友记录UID90162积分40魅力22 点财富1123 点主题威望0 点贡献点0 点阅读权限30注册时间收到鲜花0 朵活动点0 点当月幸运0 点在线时间386 小时最后登录
海川小学3年级, 积分 40, 距离下一级还需 10 积分
升级 
 66.67%
当前用户组为 海川小学3年级升级可点击顶部"财富换魅力升级"链接 把财富换成魅力 1魅力=1积分当前积分为 40, 升到下一级还需要 10 点。
帖子魅力22 点财富1123 点威望0 点贡献点0 点最后登录
技术交流帖
副标题(可选):
本帖最后由 shnan 于
18:41 编辑
请教朋友: 现在有些设计院配管图选用ISO,但所出的ISO图中内容都有所不同,现在国内是否有这类图的相关标准、规定或要求或大型设计院自定的标准,
我现在主要问题是:
1、管线坐标有的只标出高度,而不是三点坐标。
2、 没有管线的长度表,或称下料长度表。
3、尺寸标注在阀门中心而不是法兰面,显然不方便下料。
4、 只给出平面单线图,没有立面图,按ISO格式出图,到底应不应该给出立面图,
5、与其它区域相接的管线,只给出区域图号,而不是ISO图号,这样只能查两个区域管线表目录。
还有管段标记,现场焊接点标注等等。。
现在是设计院想怎么出就怎么出图,找不到制约标准或规定。
请熟悉的朋友介绍一下这方面都是怎么做的。
+1<span class='aboc_digg_num' id='aboc_digg_num_
总评分:&#160;财富 + 2&#160;
(844166号)
帖数176 个收听数个人主页精华0听众数相册帖子分享日志好友记录UID844166积分28魅力26 点财富878 点主题威望0 点贡献点0 点阅读权限30专业工艺管道注册时间收到鲜花10 朵活动点0 点当月幸运0 点在线时间181 小时最后登录
海川小学3年级, 积分 28, 距离下一级还需 22 积分
升级&#160;
&#160;26.67%
当前用户组为 海川小学3年级升级可点击顶部"财富换魅力升级"链接 把财富换成魅力 1魅力=1积分当前积分为 28, 升到下一级还需要 22 点。
帖子魅力26 点财富878 点威望0 点贡献点0 点专业工艺管道最后登录
本帖最后由 123B123 于
10:57 编辑
轴测图至少包含以下五部分:管道轴测图形、工程数据(尺寸及连接信息、焊点等)、管段材料表(施工领料用)、北向标、图签(管线号、责任人签名等信息)。一楼说的五点设计内容,全部不符合轴测图的基本设计要求,需要设计院返工,按标准规范执行,以达到能参考能施工的图纸。
一楼提到的轴测图可能是在CAD内手画的。对于中、小项目,用CAD里手画轴测图比大型3D软件更快捷、更经济,需要统计一下管段表,以方便领料。CAD手画轴测图是管道设计基本工,设计深度也有规范要求。
可见洛阳院景世光老师编写的SH/T 3052、环球郑冒鼎老师编写的HG/T 20549规定。SEI张德姜老师的《石油化工装置工艺管道安装设计手册》、环球宋岢岢老师的《全国压力管道设计及工程实例》、洛阳院王怀义老师的《管道设计便查手册》都有关于轴测图的具体介绍,可以据此提出业主的具体图纸深度要求让设计院返工修改。
[]: 一个袋子砸在了 123B123 头上,123B123 赚了 1 点 当月幸运.
系统自动给沙发加分~~
总评分:&#160;财富 + 4&#160;
帖数1017 个收听数个人主页精华0听众数相册帖子分享日志好友记录UID28201积分900魅力884 点财富337 点主题威望1 点贡献点0 点阅读权限80注册时间收到鲜花2 朵活动点0 点当月幸运5 点在线时间1562 小时最后登录
海川高中2年级, 积分 900, 距离下一级还需 300 积分
升级&#160;
当前用户组为 海川高中2年级升级可点击顶部"财富换魅力升级"链接 把财富换成魅力 1魅力=1积分当前积分为 900, 升到下一级还需要 300 点。
帖子魅力884 点财富337 点威望1 点贡献点0 点最后登录
本帖最后由 hyt1973 于
10:00 编辑
1.是否用坐标,还是用标高,根据需要,只要统一就行。无统一规定。工程上用标高多一些,坐标不直观。
2.是否标注每段管长,根据需要。如果是预制管道,一般标注每段管长。三维配管有选项,可自动标注管长。
3.标注阀门中心,是惯例。实际标注法兰面意义并不大,垫片的厚度无法保证(紧前与紧后差距较大),阀门的长度有时也有偏差。
4.ISO图不存在平面问题,本身就是空间视图。没有必要加立面图。
5.区域外的图号如何确定?是一个院设计的,还能确定。要是两个区域不是一个院设计的,怎么写图号?
ISO图目前大多数院都是软件自动产生的。用人手工画的日子已经一去不复返了,标注也大多是自动标注。如果业主对出图有要求,应提前提出,不然就是按软件默认做下来的。
总评分:&#160;财富 + 3&#160;
你的目光、你的抉择、你承受挫折的能力,就是你未来的命运
(543318号)
帖数1 个收听数个人主页精华0听众数相册帖子分享日志好友记录UID543318积分10魅力10 点财富8 点主题威望0 点贡献点0 点阅读权限20注册时间收到鲜花0 朵活动点0 点当月幸运0 点在线时间1 小时最后登录
海川小学2年级, 积分 10, 距离下一级还需 10 积分
升级&#160;
当前用户组为 海川小学2年级升级可点击顶部"财富换魅力升级"链接 把财富换成魅力 1魅力=1积分当前积分为 10, 升到下一级还需要 10 点。
帖子魅力10 点财富8 点威望0 点贡献点0 点最后登录
本帖最后由 lixiuping3 于
22:08 编辑
具体是用什么软件画的?就是那种三维立体单线图,任意角度的线是带阴影的,我在工作中主要就是用这种图施工的,有需要站内信
这是对你第一次在海川回帖的奖励哦~~~
总评分:&#160;财富 + 6&#160;
帖数887 个收听数个人主页自我介绍青岛----中国石油工程建设公司华东设计分公司精华0听众数相册帖子分享日志好友记录UID8853积分624魅力610 点财富1589 点主题威望2 点贡献点0 点阅读权限120专业化学工程与工艺注册时间收到鲜花0 朵活动点0 点当月幸运8 点在线时间764 小时最后登录
帖子魅力610 点财富1589 点威望2 点贡献点0 点专业化学工程与工艺最后登录
海川社区常住居民 在海川签到500天 可领本徽章
TA在日07时45分获得了这枚徽章。 []
设计院在使用三维设计软件直接抽图的时候,是可以自行设置的。
我公司的原则是尽量把需要表达的东西都放到图上,直观而且实用。
总评分:&#160;财富 + 5&#160;
我ida天天开心来签到了!
(552908号)
帖数594 个收听数个人主页精华0听众数相册帖子分享日志好友记录UID552908积分48魅力42 点财富3818 点主题威望0 点贡献点0 点阅读权限30注册时间收到鲜花8 朵活动点0 点当月幸运0 点在线时间272 小时最后登录
海川小学3年级, 积分 48, 距离下一级还需 2 积分
升级&#160;
&#160;93.33%
当前用户组为 海川小学3年级升级可点击顶部"财富换魅力升级"链接 把财富换成魅力 1魅力=1积分当前积分为 48, 升到下一级还需要 2 点。
帖子魅力42 点财富3818 点威望0 点贡献点0 点最后登录
已提交版主身份信息登记
TA在日17时16分获得了这枚徽章。 []
LZ说的这几条,我们出的图上都是有的...
(866700号)
帖数4242 个收听数个人主页精华0听众数相册帖子分享日志好友记录UID866700积分507魅力428 点财富4666 点主题威望4 点贡献点0 点阅读权限180专业化工注册时间收到鲜花33 朵活动点0 点当月幸运51 点在线时间1140 小时最后登录
&成长值: 2470VIP4, 成长值 3600, 距离下一级还需 1130 成长值帖子魅力428 点财富4666 点威望4 点贡献点0 点专业化工最后登录
申领前提条件为3威望,对海川热心参与的会员
TA在日07时28分获得了这枚徽章。 []
热心参与帮助他人,----本勋章暂时停止新领
TA在日13时32分获得了这枚徽章。 []
发帖数超过2000个即可自领本徽章
TA在日14时38分获得了这枚徽章。 []
a2994949 发表于
具体是用什么软件画的?就是那种三维立体单线图,任意角度的线是带阴影的,我在工作中主要就是用这种图施工 ...
用cad就能画,原来都是自己画的。
总评分:&#160;财富 + 3&#160;
天生我才必有用
为防止盗号发生 请把你的密码强度至少设置为 “字母+数字” 或 设置“安全提问”来保证你的帐号安全。禁止密码与用户名相同、禁止使用纯数字
Powered by
内容发布人须承担一切因不当内容发表而导致的全部责任
有任何不妥请与管理员
联系,未经本站许可,禁止转载本站内容32图书馆需求和类图
上亿文档资料,等你来发现
32图书馆需求和类图
需求分析报告;一、背景:;A、系统名称:贵州省水利电力学校图书管理系统;B、本项目的任务提出者:贵州省水利电力计算机09;艳鹭;本项目的最终用户:贵州省水利电力学校二、用户需求;A、系统要求提出:;贵州省水利电力学校是一家所有工作手工操作的图书管;通过调研了解到:1)图书馆希望能够在编目的时候迅;图书馆提出的要求,结合我们的技术建议再加以考虑,;2)、采编室
需求分析报告一、 背景:A、 系统名称:贵州省水利电力学校图书管理系统B、 本项目的任务提出者:贵州省水利电力计算机091班代亚,章雪,高邦磊,陈香宇,夏雪,陈张艳鹭本项目的最终用户:贵州省水利电力学校 二、 用户需求分析:A、 系统要求提出:贵州省水利电力学校是一家所有工作手工操作的图书管理,随着计算机的发展,更多的图书馆采用计算机图书管理系统来实现,这样可以得到更好的管理。目前,贵州省水利电力学校已经购买了所有的计算机硬件很网络设备。设计一从采购―编目―流通―管理 一体化的图书馆系统。主要表现:(一)采购,对新书的目录,要查存,判断图书馆是不是已经订过了,要人工查阅帐本完成,是很麻烦的事。(二)验证,要填写两个帐本和盖章,而且在帐本上面很多信息是重复的。(三)编目,通过手工对书编目,对不同种类的书都要查找书是否已有,如果没有的话对新的书进行查阅中图法宝典来要编目,并且还有填写跟书卡,和大量的查阅用的卡片。这块消耗的人力最大了。(四)流通,在借书的时候要填写跟书卡和借书证并保管跟书卡做为借条;在还书的时候工作人员先要花一定时间把保管的跟书卡先找出来,再填写跟书卡和借书证。然后再把跟书卡和书夹在一起,工作人员要消耗很多时间,大大降低了工作效率。(五)无法统计书的阅读次数、当天的借还数目等很多统计信息。 B、 系统总体需求:通过调研了解到:1)图书馆希望能够在编目的时候迅速查找新的书籍是否已编目,并可以快速编目2)图书馆希望省去编写查询卡能够用计算机进行各种快速查找。 3)图书馆希望使用条码枪来实现图书的借还书籍。4)图书馆希望通过能统计大量的以前无法统计的数据,方便管理。5)在还书时实现计算机自动进行罚款;6)有多个库,要可以灵活设置库的性质。7)图书管理员有不同的职位要可以进行权限设置。 C、 对系统的要求:图书馆提出的要求,结合我们的技术建议再加以考虑,产生了该管理信息系统的功能要求: 1)、编制一套采购管理系统(订购和购书);2)、采编室需要一个管理模块,主要是查询库存进行验收和所有书的个别帐登记,以及编目管理系统;3)、编制一套流通(借书和还书)管理系统 ; 4)、编制一套库存管理系统(库存); 5)、查询模块;6)、用户管理(用户记录管理和权限设置); 7)、统计打印模块。 8)、做个有条形码的借书证,方便借书还书。 9)、在编目和流通这两块一定要改善,用计算机管理。 a) b) c) d)在图书管理软件字体要大点。对不同库不同级别的读者在借书量和借期分不同的权限。 对库能够灵活设置。做个借期超过要求罚款的功能,每天罚款多少(不同类的书罚款不同)e) f) g) h)不同的管理员有不同的权限。 软件系统安全上要有一定的保障。 增加各种尽可能多的统计功能 安装磁条,增加图书安全性。D、对性能的要求:学校对系统性能无特殊的要求,只要查询图书的时候没有明显的延迟就可以了,我图书馆目前有藏书20万册,查询的时候不要超过3秒钟。 E、 条件、假定和限制:
1)、系统最小寿命:系统应该能在无重大改动的条件下正常运行2-3年以上。
2)、对设备的要求:要求计算机稳定性良好,整套系统经济实惠。
3)、可以利用的信息和资源:图书管已经配置了所以的计算机,以及网络设备,操作人员将使Windows XP4)、图书管员工受过较好的计算机方面的培训,在调研的时候感觉有不少员工有计算机方面的专业经验。5)、以下是对贵州省水利电力学校调研时获得的总体需求。a)在编目的时候自动迅速查找新的书籍是否已编目,并可以快速编目。b)能够用计算机进行快速查找,已确定图书的名称和存放的位置。 c)使用条码枪来实现图书的借还书籍。d)统计当天工作人员工作流量和流量统计情况。 e)查找出一本已借出的书现在在谁那里。 f)各类查找功能g)统计一本借书证在一段时间内借过的借过多少书。 h)统计一本书在一段时间内被谁借过。j)在还书时实现计算机自动判断图书借阅是否超期根据条理进行罚款;可以设置罚款条理。 k)在书丢失时进行赔偿。可以自行设置赔偿条理。l)有多个库,要可以灵活设置库的性质(1、是否可借2、借阅时间3、不同的读者借阅本书可以进行设置4、增加、删除、修改库)。m)图书管理员有不同的职位要可以进行权限设置。(管理员和操作员) n)读者信息管理(权限设置)9) 系统数据流图描述:总图:(1)数据流:计划订单 = 编号+书名+出版社+版期和版次+价目+册数+总价款+备注+订单日期 实际订单 = 编号+书名+出版社+版期和版次+价目+册数+总价款+备注+订单日期 供书单 = 编号+书名+出版社+版期和版次+价目+册数+总价款+备注+供书日期 退书信息 = 编号+书名+出版社+版期和版次+价目+册数+总价款+备注+退书日期 采购单 = 编号+书名+出版社+版期和版次+价目+册数+总价款+备注+订单日期 实际购书单 = 编号+书名+出版社+版期和版次+价目+册数+总价款+备注+订单日期 总括登记信息 = 编号+书名+出版社+版期和版次+价目+册数+总价款+备注+购书日期所有新购的书 = 编号+登记日期+登记号码+书名+著者或译者+出版社+版期或版次+页数+尺寸+来源+价目+备注每本书的个别登记 = 编号+登记日期+登记号码+书名+著者或译者+出版社+版期或版次+页数+尺寸+来源+价目+类号+备注分类号 = 管理员根据书名从中图法中查得的分类号 新种次号信息 = 种次号 查询种次信息 = 种次号跟书卡信息 = 索书号+书名+所赔价款+财产号+姓名+借期+还期查询信息 = [索书号|书名|丛书|编者|译者|出版社|出版日期|页数|尺寸|辅助项|价款|登记日期] 各类查询卡信息 = 索书号+书名+丛书+编者+译者+出版社+出版日期+页数+尺寸+辅助项+价款+登记日期 查询结果 = 索书号+书名+丛书+编者+译者+出版社+出版日期+页数+尺寸+辅助项+价款+登记日期 借书人姓名及日期= 借书人姓名+借书日期 读者信息 =借书日期 + 书名 + 备注 书 = 图书馆馆藏的书及书名 借书信息 = 索书号 还书日期 = 还书时的时间(2)数据存储:共有以下表格: 各表详细描述:表编号:TBL001
表名:订书存根 数据存储名:订书存根 组成:{计划订单}组成形式:按订购时间降续排列表编号:TBL002
表名: 总括登记帐 数据存储名:总括登记帐 组成:{总括登记信息}组成形式:按登记时间降续排列表编号:TBL003
表名: 个别登记帐 数据存储名:个别登记帐 组成:{每本书的个别登记} 组成形式:按登记时间降续排列包含各类专业文献、外语学习资料、高等教育、幼儿教育、小学教育、生活休闲娱乐、中学教育、应用写作文书、各类资格考试、文学作品欣赏、32图书馆需求和类图等内容。 
 类图、对象和图包的建立 年月 日至 年月日 计算机 专业 12 班 课程名称: 设计题目: 完成期限:自 设计依据、要求及主要内容(可另加附页): 1、设计依据: ...  图书馆管理系统类图 隐藏&& 图书管理系统的要求 可以将图书和杂志借给读者,这些读者在系统中已经注册过了,图书和杂志已经注册过了 **登陆才能借书,系统有的书才能...  图书馆管理系统类图、数据库、包图设计_IT/计算机_专业资料。图书馆管理系统类图、数据库、包图设计一、图书馆管理系统类图 图书馆管理系统类图 User userID : Stri...  图书馆管理系统用例图、活动图、类图、时序图_计算机软件及应用_IT/计算机_专业资料。图书馆管理系统 一.图书馆管理系统需求分析 1、系统目标设计 系统开发的总目标...  《软件工程》 目: 面向对象分析与设计综合实验 图书馆管理系统 班学姓 级: ...OOA 要求:用类图建立系统的对象模型;用状态图建立系统的动态模型(要配置必要的 ...  网上书店 需求分析 包括连类图 ,顺序图,活动图_表格类模板_表格/模板_实用文档...通过前面分析可以理解到现在很多上班族因为忙于工作而没有很多的时间去图书馆、...  图书管理系统类图分析 8页 1下载券 图书管理系统功能模块图 4页 免费喜欢此文档的还喜欢 图书馆管理系统类图、数... 4页 1下载券 图书管理系统用例图 3页 免...  设计任务:对根据给出的需求,对图书管理系统进行 UML 建模。 具体要求:软件需求...图 8:图书馆管理系统预订书籍活动图 五、图书馆管理系统的类图图书馆管理系统的...  图书馆管理系统用例图、活动图、类图、时序图_电脑基础知识_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档 图书馆管理系统用例图、活动图、类图、时序图...求这类图,或这类图的贴吧?_百度知道
求这类图,或这类图的贴吧?
com/zhidao/wh%3D600%2C800/sign=1b263fb4d639bb1df2fe7ccb1feaa014c086f06f08b&nbsp://g.baidu.hiphotos.jpg" esrc="/zhidao/pic/item/9f2fe7ccb1feaa014c086f06f08b:///zhidao/wh%3D450%2C600/sign=346fec67506e77cec29e27/9f2fe7ccb1feaa014c086f06f08b.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http.hiphotos.baidu.<a href="http://g
提问者采纳
你可以去x 战警吧看看
提问者评价
太给力了,你的回答完美地解决了我的问题,非常感谢!
其他类似问题
为您推荐:
类图的相关知识
其他1条回答
com/bbs/thread-来自.com/bbs/thread-.nanningjie.nanningjie:
下载知道APP
随时随地咨询
出门在外也不愁leetcode 解题报告 Word Ladder II - IT屁民 - 博客园
Happy coding, happy life~
posts - 92, comments - 3, trackbacks - 0, articles - 0
题目不多说了。见/problems/word-ladder-ii/
这一题我反复修改了两天半。尝试过各种思路,总是报TLE。终于知道这一题为什么是leetcode上通过率最低的一道题了,它对时限的要求实在太苛刻了。
在我AC版本代码的前一个版本,最好也就过了单词长度为7的test case。然后就TLE了。
到底问题在哪儿?我从算法,STL数据结构,代码优化各种角度思考。比较可惜的是,直到最后我也没有弄清为啥能AC,为啥会TLE。(都是我写的代码,都是我的思路,太诡异了。。。)
但不管如何,通过这一题,学到的还真是挺多。这里总结下吧。
拿到这一题的时候,首先想到的就是爆搜。依次替换单词中的字母,然后依次为基础进行搜索。
是BFS还是DFS呢?
先引用下Stack Overflow上的两个解答
That heavily depends on the structure of the search tree and the number and location of solutions. If you know a solution is not far from the root of the tree, a breadth first search (BFS) might be better. If the tree is very deep and solutions are rare, depth first search (DFS) might take an extremely long time, but BFS could be faster. If the tree is very wide, a BFS might need too much memory, so it might be completely impractical. If solutions are frequent but located deep in the tree, BFS could be impractical. If the search tree is very deep you will need to restrict the search depth for depth first search (DFS), anyway (for example with iterative deepening).
--------------------------------------------------------------------------------------
BFS is going to use more memory depending on the branching factor... however, BFS is a complete algorithm... meaning if you are using it to search for something in the lowest depth possible, BFS will give you the optimal solution. BFS space complexity is&O(b^d)... the branching factor raised to the depth (can be A LOT of memory).
DFS on the other hand, is much better about space however it may find a suboptimal solution. Meaning, if you are just searching for a path from one vertex to another, you may find the suboptimal solution (and stop there) before you find the real shortest path. DFS space complexity is&O(|V|)... meaning that the most memory it can take up is the longest possible path.
They have the same time complexity.
其实这一题很容易在脑海汇中勾勒一下DFS/BFS搜索树的大致样子。
如果选用DFS(即广义上的爆搜递归)
void search(string &word, string &end, unordered_set&string& &dict, int level)
if(word == end)
if( level == dict.size())
for(int i = 0; i & word.length(); i++)
for(int ch = 'a'; j &='z'; j++)
string tmp =
if(tmp[i] == ch)
if(dict.count(tmp) & 0)
search(tmp, end, dict, level+1);
如此,必须要遍历整棵搜索树,记录所有可能的解路径,然后比较最短的输出,重复节点很多,时间复杂度相当大。有人问可以剪枝么,答案是这里没法剪。如果把已经访问过的剪掉,那么就会出现搜索不完全的情况。
看来直接上来爆搜是不行的。效率低的不能忍。
这样看,如果将相邻的两个单词(即只差一个字母的单词)相互连在一起,这就是一个图嘛。经典的图算法,dijiska算法不就是求解最短路径的算法么。
那么就说直接邻接表建图,然后dijkstra算法求解咯,当然是可以的,边缘权值设为1就行。而且这种思路工程化,模块化思路很明显,比较不容易出错。但此种情况下时间需建图,然后再调用dijkstra,光是后者复杂度就为o(n^2),所以仍有可能超时,或者说,至少还不是最优方法。
建图后进行DFS呢。很可惜,对于一个无向有环图,DFS只能遍历节点,求最短路径什么的还是别想了。(注意,这里对图进行DFS搜索也会生成一颗搜索树,但是与上文提到的递归爆搜得到的搜索树完全不一样哦,主要是因为对图进行DFS得不到严谨的前后关系,而这是最短路径必须具备的)
好了,我们来看看一个例子
如何对这个图进行数据结构上的优化,算法上的优化是解决问题的关键。
通过观察,容易发现这个图没有边权值,也就是所用dijkstra算法显得没必要了,简单的BFS就行,呵呵,BFS是可以求这类图的最短路径的,
正如wiki所言:若所有边的长度相等,广度优先搜索算法是最佳解&&亦即它找到的第一个解,距离根节点的边数目一定最少。
所以,从出发点开始,第一次"遍历"到终点时过的那条路径就是最短的路径。而且是时间复杂度为O(|V|+|E|)。时间复杂度较dijkstra小,尤其是在边没那么多的时候。
到此为止了么。当然不是,还可以优化。
回到最原始的问题,这个图够好么?它能反映问题的本质么。所谓问题的本质,有这么两点,一是具有严格的前后关系(因为要输出所有变换序列),二是图中的边数量是否过大,能够减小一些呢?
其实,一个相对完美的图应该是这样的
这个图有两个很明显的特点,一是有向图,具有鲜明的层次特性,二是边没有冗余。此图完美的描述了解的结构。
所以,我们建图也要有一定策略,也许你们会问,我是怎么想出来的。
其实,可以这样想,我们对一个单词w进行单个字母的变换,得到w1 w2 w3...,本轮的这些替换结果直接作为当前单词w的后继节点,借助BFS的思想,将这些节点保存起来,下一轮开始的时候提取将这些后继节点作为新的父节点,然后重复这样的步骤。
这里,我们需要对节点&分层&。上图很明显分为了三层。这里没有用到队列,但是思想和队列一致的。因为队列无法体现层次关系,所以建图的时候,必须设立两个数据结构,用来保存当前层和下层,交替使用这两个数据结构保存父节点和后继节点。
同时,还需要保证,当前层的所有节点必须不同于所有高层的节点。试想,如果tot下面又接了一个pot,那么由此构造的路径只会比tot的同层pot构造出的路径长。如何完成这样的任务呢?可以这样,我们把所有高层节点从字典集合中删除,然后供给当前层选取单词。这样,当前层选取的单词就不会与上层的重复了。注意,每次更新字典的时候是在当前层处理完毕之后在更新,切不可得到一个单词就更新字典。例如我们得到了dog,不能马上把dog从待字典集合中删除,否则,下次hog生成dog时在字典中找不到dog,从而导致结果不完整。简单的说,同层的节点可以重复。上图也可以把dog化成两个节点,由dot和hog分别指向。我这里为了简单就没这么画了。
最后生成的数据结构应该这样,类似邻接表
hot---& hop, tot, dot, pot, hog
dot---&dog
hog---&dog, cog
&ok。至此,问题算是基本解决了,剩下的就是如何生成路径。其实很简单,对于这种&特殊&的图,我们可以直接DFS搜索,节点碰到目标单词就返回。
这就完了,不能优化了?不,还可以优化。
可以看到,在生成路径的时候,如果能够从下至上搜索的话,就可以避免那些无用的节点,比如hop pot tot这类的,大大提升效率。其实也简单,构造数据结构时,交换一下节点,如下图
dog---&dot, hog
cog---&hog
hop---&hot
tot---&hot
dot---&hot
pot---&hot
hog---&hot
说白了,构造一个反向邻接表即可。
对了,还没说整个程序的终止条件。如果找到了,把当前层搜完就退出。如果没找到,字典迟早会被清空,这时候退出就行。
说了这么多,上代码吧
1 class Solution {
3 vector&string& temp_
4 vector&vector&string&& result_
6 void GeneratePath(unordered_map&string, unordered_set&string&& &path, const string &start, const string &end)
temp_path.push_back(start);
if(start == end)
vector&string& ret = temp_
reverse(ret.begin(),ret.end());
result_path.push_back(ret);
for(auto it = path[start].begin(); it != path[start].end(); ++it)
GeneratePath(path, *it, end);
temp_path.pop_back();
23 vector&vector&string&& findLadders(string start, string end, unordered_set&string& &dict)
temp_path.clear();
result_path.clear();
unordered_set&string& current_
unordered_set&string& next_
unordered_map&string, unordered_set&string&&
unordered_set&string& unvisited =
if(unvisited.count(start) & 0)
unvisited.erase(start);
current_step.insert(start);
while( current_step.count(end) == 0 && unvisited.size() & 0 )
for(auto pcur = current_step.begin(); pcur != current_step.end(); ++pcur)
string word = *
for(int i = 0; i & start.length(); ++i)
for(int j = 0; j & 26; j++)
string tmp =
if( tmp[i] == 'a' + j )
tmp[i] = 'a' +
if( unvisited.count(tmp) & 0 )
next_step.insert(tmp);
path[tmp].insert(word);
if(next_step.empty()) break;
for(auto it = next_step.begin() ; it != next_step.end(); ++it)
unvisited.erase(*it);
current_step = next_
next_step.clear();
if(current_step.count(end) & 0)
GeneratePath(path, end, start);
return result_
&此外,这里还有一份代码,写的比较乱,但用的传统队列的思想,用两个标记变量来指示层数的变化。也AC了。
class Solution {
vector&vector&string&&
vector&string&
void FindPath(unordered_map&string, unordered_set&string&& &graph, const string &start, const string &end)
cur.push_back(start);
if(start == end)
vector&string& ret =
reverse(ret.begin(),ret.end());
output.push_back(ret);
for(auto it2 = graph[start].begin(); it2 != graph[start].end(); ++it2)
FindPath(graph, *it2, end);
cur.pop_back();
vector&vector&string&& findLadders(string start, string end, unordered_set&string& & _dict)
unordered_set&string& dict = _
if(dict.count(start) &0)
dict.erase(start);
output.clear();
cur.clear();
unordered_map&string, unordered_set&string&&
queue&string&
unordered_map&string, int&
q.push(start);
depth[start] = 0;
bool found = false;
int cur_deep = 0;
int pre_deep = 0;
while(!q.empty())
string word = q.front();
pre_deep = cur_
cur_deep = depth[word];
if(pre_deep != cur_deep)
if(depth.count(end) & 0)
found = true;
else if(depth.size() == dict.size() + 1)
for( int i = 0; i & start.length(); ++i)
for(char ch = 'a'; ch &= 'z'; ch++)
string tmp =
if(tmp[i] != ch)
int t = depth.count(tmp);
if((t == 0 && dict.count(tmp) & 0) || (t & 0 && depth[tmp] == cur_deep + 1) )
graph[tmp].insert(word);
if(t == 0)
q.push(tmp);
depth[tmp] = cur_deep + 1;
FindPath(graph, end, start);

我要回帖

更多关于 类图工具 的文章

 

随机推荐