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来看对不对
重要重要重要!! 对于这个算法来说 边的权重不能为负数!