NPC,拓扑排序,图论
问题背景:给定一个有向无环图(DAG)以及这个有向无环图的某个拓扑排序序列,现在添加一个点和与这个点有关的边(指向此点或者从此点指向已有点都是有可能的,而且可能同时存在好多条边),但是!!可以保证添加这个点以后的DAG图还是一个有向无环图,如果想要将后来添加的这个点加入到这个序列中,同时使得这个序列成为这个添加点以后的DAG图的拓扑排序序列,求问如何移动已有的点,使得需要的移动次数最少?(自我认为是NPC。。。。。)
举例:例如某个DAG图中有四个点a,b,c,d.并且有两条边a指向b,c指向d,符号描述为{V,E}={ (a->b), (c->d) }。给定的拓扑排序序列为[a,b,c,d]。
例子一:现在添加一个点e,和一条边(e->d),
那么此时只需将d后移一个位置,e插入到原来d的位置即可满足题目要求,即后来的序列为【a,b,c,e,d】,则只需一个移动即可。要注意的是,这时候像【a,b,e,c,d】也是满足要求的序列,但是可以看出此时需要移动两次。
例子二:再如,若新加点e和新加边为(e->c)和(e->d),则仅需将b移动到原序列最后,e插入到b的位置即可,也就是需要一次移动即可