把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

题解 P8017 [COCI2013-2014#4] UTRKA

洛谷

题意

这个原题描述应该足够理解。

分析

首先可以把 MiSi 缩去,令 wi=SiMi,那么我们最后题目就变成了求一条首尾相同的路径权值和大于 0,其路径数最小并且在路径数相同情况下权值和最大。(可以重复经过)。

这有点像我们的定长路径的最短路,那么我们用矩阵来维护我们的某个点开始的 k 步的最长路径长度。

先从暴力打起,确定我们的起点,再枚举路径数,看看此时到自己的最长路径长度是否大于 0,如果是,就更新答案,并且结束。

inline void solve(int st) {
ans=<%1,n%>;
for(int i=1; i<=n; ++i) ans.a[1][i]=-INF;
ans.a[1][st]=0;
for(int i=1; i<=t; ++i) {//小优化,初始值为 m
ans=ans*bas;
if(ans.a[1][st]>0) {
if(t>i) t=i,res=ans.a[1][st];
if(t==i) res=max(res,ans.a[1][st]);
return;
}
}
}

就是这样简单的思路,我们就先拿下了 118pts
时间复杂度:O(n4×t)

接下来有两种优化方向,我们都需要运用。

  1. 优化枚举起点,这里占据了 O(n) 的时间复杂度。
  2. 优化取得答案,这里占据了 O(t) 的时间复杂度。

优化第一个。

我们其实并不需要枚举起点,每个起点他们的所乘 bas 都是一样的,我们尝试把求第 i 个开始最后到达自己的最长路径融入 bas

在起始时,我们将所有的 basi,i 设为 0,那么,我们就相当于把所有的 ans 融入了我们的 bas,而这样对我们的答案转移是否有影响呢?

显然是没有的,应为我们要求的是最长路径长度,我们多走一条长度为 0 的自环,并没有增长长度。

可以再次拿下一个点。

优化第二个。

在不优化第一个的前提下,我们同样也是可以优化的。

就像我们的第一个优化,给 st 连一个自环,那么我们最后求出的就是至多 k 条边的最长路径长度,显然,这是满足二分性质的,我们二分套一个矩阵快速幂即可。(但是好像两个 log 还变慢了)。

再其基础上,我们可以发现,我们第一个优化后,也是满足二分性质的。

但是还可以更进一步,因为我们二分后是有一个快速幂操作的,快速幂本质上其实与倍增无异,我们单用倍增优化掉这一个二分。

时间复杂度:O(n3×logm)

这个时间复杂度其实已经足够度过这道题了,但是我们可以更快一点点。

分析一下答案的范围,我们答案的范围是多少,之前我们用最短路的一个最值,也就是我们的边数,但是我们的答案范围其实只有 n

为什么呢,假如说大于了 n,那么就代表,我们必然经过了一个环,而且这个环还一定是一个正环,否则我们并不用经过这个环。而又因为这个环是正环,所以我们从环上去一个节点作为起点,而这个节点在跑完环是也是正值,因而答案不超过 n

时间复杂度:O(n3×logn)

n=read(),m=read();
bas=<%n,n%>;
for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j) bas.a[i][j]=-INF;
for(int i=1; i<=n; ++i) bas.a[i][i]=0;
for(int i=1; i<=m; ++i) {
int u=read(),v=read(),mm=read(),ss=read();
bas.a[u][v]=max(ss-mm,bas.a[u][v]);
}
pw[0]=bas;
for(int i=1; i<=M; ++i) pw[i]=pw[i-1]*pw[i-1];
ans=bas;
int tot=1;
for(int i=M; ~i; --i) {
MAT res=ans*pw[i];
if(!res.check()) tot+=(1<<i),ans=res;
}
++tot,ans=ans*bas;
cout<<tot<<" "<<ans.get();//get:获取最大值
return 0;
posted @   djh0314  阅读(10)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示