一共有$T$组数据,每组数据给定一张有$n$个点,$m$条边的无向图,点$i$的类型为$type_i$,其中$type_1$要么为$1$,要么为$2$。一个人想从$s$走到$t$,如果他经过的点$i$中$type_i=1$,则$p_1++$,否则$p_2++$。求出在任何时候,$\vert p_1-p_2\vert\leq k$,为条件下的最短路径。(有点牵强,理解就好)
$\texttt{Data Range:}T\leq 10,n\leq 10^4,m\leq 10^5,k\leq 10$
链接
题解
去搞生地会考了,所以近一个月没有更博客。(这就是理由??)
设可乐的权值为$-1$,汉堡的权值为$1$,喝掉的可乐的数量减去吃掉的汉堡的数量为$p$。
由于$k\leq 10$,所以可以考虑将一个点$i$拆成$2k+1$个点$i_{-k},i_{-k+1},\cdots ,i_{-1},i_0,\cdots ,i_k$,这里,$i_l$是指到达$i$且$p=l$时的最短路总长。
加边的话就这么做:(这里假设现在加的边是$(i,j)$)
如果$j$卖汉堡的话,就从$i_l$连到$j_{l-1}$,其中$i_{-k}$不要连边,就像这样:
如果$j$卖可乐的话,就从$i_l$连到$j_{l+1}$,其中$i_{k}$不要连边。
但是,这是个无向图啊,按照上面的连边方式,连出来的是个有向图,而这题的边又不对称。
所以说,在加边$(i,j)$时,按照上面的方法先加一条边,在把$i,j$换一下,就行了。
于是在新的图上跑一遍最短路就做完了。
但是,这里有一些地方需要注意:
首先是起点的问题,这个应该不用多说,在起点或终点也要买可乐或汉堡。
然后是终点的问题,答案是终点拆出来的每一个点的最短路的最小值。
最后,要特判$k=0$的情况!!!
最最最后,多组数据,记得清零!!!
代码
1 |
|