居然1个ac。。。100分。。。
先T1
题目大意求一个图是否存在多个拓扑序列。。。。
我c这么简单。。。
看看队列,一次排序之后队列里有好多的话就return false结束。。。
送分大水题、、、
开开心心写一个小时,ac两个样例。。。
放正解:来自讲课的学长zeyu song
“对这个图进行拓扑排序。
如果队列中某个时刻剩余的点数大于 1,此时可以从队列中任取一个点,因此拓扑序不唯一。
只有当队列中任意时刻点数都小于等于 1
时,拓扑序唯一。”
然后T2
题目大意:一个图,没事闲的要删点,删点之前还不停地问最短路
我拿到题之后:我c这不就弗洛伊德吗。。。
然后就开始写弗洛伊德
顺序是啥来着
k,i,j是吧
然后就发现咋删点啊
矩阵平移下就可以了
然后开始想平移
想了半天发现需要两个数组
我c
好吧。。。
然后就看bug看了两个小时
然后。。。bug没看出来时间到了
放正解:来自讲课学长zeyu song
“可以将删点过程看成一个反向加点的过程。问题转化为每次加一个点,询问最短路之和。
设
f [
i][
j][
k]
表示从
j
到
k
,只经过加的前
i
个点的最短路。
这其实就是 floyd
的过程,只需将 floyd
中中间点的枚举顺序换成加点的顺序。
用第
i
个加入的点作为中间点更新最短路后,计算前
i
个加入点之间的最短路之和即可。”
没有T3
放大意正解
题目大意从1号点出发回到1号点,要求经过的点尽量多,有一次反向的机会(可以不用)
问点的数量。。。
看完第一反应:
不会!!!
还是来自zeyu song的正解:“
首先将图中的强联通分量用 tarjan
算法缩点。缩点后的图是一张拓扑图。定义缩点后一条路径的权值是这条路径上所有强联通分量的点数之和。最终的路径在缩点后的图中一定可以表示成如下形式:
path(
bel[1]
; i)
> path(
j; bel[1])
其中
path(
x; y)
表示在缩点后的图中从
x
到
y
的权值最大的路径,且缩点后的图中存在一条从
j
到
i
的边。
bel[1]
表示
1
所在的强联通分量。
用拓扑图上的 dp
求出
f [
i]
表示缩点后的图中从
i
到
bel[1]
的权值最大的路径。将缩点后图中所有边反转,dp
求出
g[
i]
表示从
i
到
bel[1]
的权值最大的路径。
g[
i]
即为反转边之前,从
bel[1]
到
i 的权值最大的路径。
枚举缩点后图中所有边
u > v。
用
g[
v] +
f [
u]
size[1]
更新答案。
size[1]
为
1
点所在强联通分量大小。”
总结与反思
图论还是没咋学好
不过第二个ac比较开心啊哈
哈哈哈。。。