Tag: dijkstra


题目:http://acm.scs.bupt.cn/onlinejudge/showproblem.php?problem_id=1095 题意:这题要在一个无向正权图上找单源最短路,找到目标点后,还要求出到达这个点的最短路径的数量。有重边。 解法:dijkstra+DP。正权图找最短路首先想到dijkstra,然后考虑如何获得最短路数量和怎样处理重边。因为两点间只需一条最的路径就够了,因此记录图的时候可以考虑忽略其他权比较高的路径,只记录最短的那条。并且增加一个二元数组记录相邻点间的最短路径条数。此外有数组d记录起点到各点的最短距离,count记录到达这点的最短路径数。在dijkstra过程中,加入新节点后松弛没找到最短路的点的过程中,考虑如果松弛过程中d[i]==d[pos]+map[pos][i],则count[i]+=count[pos]*p[pos][i](此处之前错误写成了count[i]++,-_-!),如果d[i]>d[pos]+map[pos][i],则count[i]=count[pos]*p[pos][i]。最后输出d[b],count[b]就行,注意各数组初始化,并且注意是两组输出之间有空行,最后一组输出后不用空行,仅换行,这里我也悲剧了一次。


昨天开始感冒,浑身无力,感觉不爽。今天写了两个,第一个是单调子序列,就不贴了。第二个是这个DP。题目:http://acm.scs.bupt.cn/onlinejudge/showproblem.php?problem_id=1094题目意思是求一个序列,这个序列满足三个一组,并且每组有一个属性m,这个m=min((a-b)^2+(b-c)^2+(a-c)^2),其中a,b,c为序列中这组数的值。求得的序列是在N个元素的序列中的K组,使得这K组的m值和最小。解法:DP。考虑到如果abc顺序排列,则m只能取得(a-b)^2或(b-c)^2之一。类似01背包,将每个数当作每个物品,这个物品重量是1。因为决定一组数的m值尽取决于两个元素,因此第三个元素可以在没被选择的数里任意选择。状态转移:dp[i][j]=min(dp[i-2][j-1]+(a[i]+a[i-1])^2,dp[i-1][j-1])。这个状态转移的意思是,当考察了a中前i项并且最多组k队时的最小m值。这里实际上是在决定将a[i],a[i-1]加入组队,还是保持不变。因为这里每个人的重量为1,而最大容量相当于2*K因此,一定可以将背包装满。因此可以得到K组人。代码:点击下载

CodePhoto.WTF © 2025