放弃思考.gif
查看原帖
放弃思考.gif
9315
zhyh楼主2021/1/18 16:59

AC 7 (再加上一个 hack 数据),WA 3 ,含有 0 边的测试点都错了。
蒟蒻表示既不确定为什么对了,也不知道为什么错了...

我的想法是:记单源最短路 dist[i]dist[i] ,单汇最短路 tsid[i]tsid[i] ,最短路 d=dist[N]d=dist[N] ;记 f[i][j]f[i][j] 表示 当前在节点 ii ,已走路程加上至少还需走的路程比 ddjj 的方案数。即,设当前已走 ss ,有 s+tsid[i]=d+js + tsid[i] = d + j 我不太清楚这么设定的道理在哪,感性理解大概是“还有距离 jj 可以浪”的样子qwq;或者干脆就当成某种定义好的“状态”吧,且仅有 0jK0\leq j \leq KKK 含义如题)的状态的节点有机会被统计...
按这个理解的话,答案就是 Σj=0Kf[N][j]\Sigma^{K}_{j=0} f[N][j]
然后对于每个节点 ii ,其状态 jj
j<dist[i]+tsid[i]dj < dist[i]+tsid[i]-df[i][j]=0f[i][j]=0
j=dist[i]+tsid[i]dj = dist[i]+tsid[i]-df[i][j]=sum[i]f[i][j]=sum[i]sum[i]sum[i] 表示从起点走到 ii 的最短路径数,
j>dist[i]+tsid[i]dj > dist[i]+tsid[i]-d 时考虑用递推。

我们考虑一条边 uu -> vv ,边权 wwuuvv 各自的状态分别是 ppqq ,则有 s+tsid[u]=d+ps + tsid[u] = d + p , s+w+tsid[v]=d+qs + w + tsid[v] = d + q ,联立下就有 p+(w+tsid[v]tsid[u])=qp + (w + tsid[v] - tsid[u]) = q ,因为括号里的东西是不为负的,干脆替换成 ww' 搞一个新图;由上,对于任意一条有向边 uu -> vv ,前者的状态值小等于后者,按这个性质就能跑记搜了。

那什么时候发现有无穷条路线呢?因为跑记搜时调用的状态值仅仅是不减的,那如果跑到当前还在搜索栈里的点,就会无限累加下去,这时就能退出了。

AC 7 (再加上一个 hack 数据),WA 3 ,含有 0 边的测试点都错了。下了个测试点,应该是统计部分出错了。然而蒟蒻连怎么对的都不确定,更不知道为什么错了...(从上面的推导中看不出零边特殊在哪)但感觉至少判断是否有无穷条路线以及不含零边的部分能过,应该还是有点道理的做法吧(小声)

求教qwq

2021/1/18 16:59
加载中...