Keshi in Search of AmShZ (最短路好题->dij优化dp)

首先先把题目搞明白,

两个指令,

1.随机走向一个城市

2.删除一条边

使从1出发到n的天数最短。 一开始的思路是二分,然后暴力删边,跑最长路判断。明显时间复杂度太高了。

既然他是一步一步走的,那么就一步一步分析,不如说一层一层分析

dp方程为dis[i]为从1到i的最小距离,cnt[i]为i的入度
j为i直接相连的节点
那么当我知道dis[j]时,就可以更新dis[i]了,将dis[j]有小到大排序,

若dis[j]<dis[j+1]+inf,那么用dis[j]+cnt[i]就是最小的,若dis[j]=dis[j+1],那么dis[j]+cnt[i]-1,就是最小的,若dis[j]+1==dis[j+1],那么所有dis[j]+cnt[i]就是最小的,现在将问题转化为了,求dis[j]中最小的,并且求出有多少个和它相等same
dis[i]=dis[j]+cnt[i]-same;

出现问题,就是当更新dis[i]的时候,不仅仅要知道cnt[i],还得知道j的出度,因为j和i直接相连,还会有从j出发的路径能到达i,那么这时候答案明显变小,因为不能保证克什一定会走最短的。

分析一下,是因为每次用最小的更新的时候,实际是用最理想的天数更新,所以考虑让最有可能成为答案的符合克什随机走的最大值,就是去dis[j],最小的时候一定不走其他的路。
数据:
1 2
2 1
1 4
1 4
1 3
1 3
1 3
3 2
2 4
4 2
所以建反图啊这样就可以让最可能的答案符合克什的随机走。
那么统计反图中的入度,来模拟从j到i,所以从n来跑,跑到1。
那么考虑怎么找每层,怎么找dis[j]最小和same,
正解是迪杰斯特拉+枚举same,因为正如上面分析的,

若dis[j]<dis[j+1]+inf(inf>cnt[i]),那么用dis[j]+cnt[i]就是最小的,若dis[j]=dis[j+1],那么dis[j]+cnt[i]-1,就是最小的,若dis[j]+1==dis[j+1],那么所有dis[j]+cnt[i]就是最小的,现在将问题转化为了,求dis[j]中最小的,并且求出有多少个和它相等same
dis[i]=dis[j]+cnt[i]-same;
same就是逐一枚举,每更新一次--
就是若dis[j]中的增量是1那么新的dis[j+1]=d[j]+1,same的减量是1,所以相等。

所以dijstra会将答案更新,也就不用找相同的same。实在妙。

posted @ 2022-06-24 11:48  zasdcn  阅读(122)  评论(0编辑  收藏  举报