代码随想录冲冲冲 Day56 图论Part8

117. 软件构建

这道题是使用拓扑排序的方法 看多个任务有优先级的情况下 怎么排序

对应到这道题就是文件排序

首先要记录每一个点的入度,当一个点的入度为0时,就说明这个点是顶点

然后记录每一个点向那些点相连

之后建立一个queue

寻找一个入度为0的点作为起点

对于这个queue进行操作

每次取出这个点,因为这个点的入度一定为0 所以可以直接放入result集中

接着更新这个确认的点指向的其他点,把这个点去掉的方法就是把所有相连的点的

入度-1。减去之后如果有一个,点的入度变成了0,也就是说这点变成了下一个起始点

就放入到que当中,最后把result里所有点打印出来。

如果说result集中的个数 不等于总个数,这就说明有的点入度一直都不可能为0;

这就是成环的情况 出现这种情况就打印出-1;

47. 参加科学大会(第六期模拟笔试)

这道题是使用dijkstra去找从起始点到终点的最近距离

这道题和prime方法非常相似,区别是prime算的是节点到树的最小距离

dijkstra是节点到原点的最短距离

首先先确认起始点和重点 并且建立mindist和visit 

由于就是从start节点开始的 所以mindist[start] = 0;

之后就是便利所有的点

第一步找到没有访问过的点中离七十点最近的

第二部 把这个点更新成已经访问过的

第三步 看其他没有访问过的节点,看这些节点有没有跟之前的cur相连

如果说有项链,并且之前cur到原点的值 + cur到邻边的值小于现在记录的minDist[v]

就把minDist[v]更新成minDist[cur] + grid[cur][v]

最后就要拿出minDist[end]

如果想要记录整个的路程 就跟prime一样就可以

关于debug可以打印minDist来看对不对

重要重要重要!! 对于这个算法来说 边的权重不能为负数!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值