[ABC137E] Coins Respawn 题解

ABC137E Coins Respawn 题解

洛谷。

题目简述

给定一个 n n n 个点, m m m 条边的有向图,从点 1 走到点 n,若总共走了 x x x 步,则最后需要减去 x p xp xp。

求是否有一个最大值,若有,输出。否则,输出 -1。

思路

先看需要减去 x p xp xp 的问题。

显然每经过一条边都需要减去一个 p p p,那么不妨将每条边的权值减去 p p p。

再来看看没有答案的情况是咋样的。

显然,若图中出现了正权环,且是最长路上经过的环,则无解。

那么第一反应就是用 spfa 判正环。

再优化一下。

都知道了必须是路上经过的环,那么不如先 dfs 一遍,从 n 号点出发,因为是有向图,所以建个反图,暴力 dfs,并记录所有遇到的点。

在 spfa 中,若遇到了没有在路径上的点,则跳过,否则正常松弛操作。

AC Code

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define ljl long long
const ljl N=2505,M=5005,inf=-1e18;
ljl n,m,p,head[N],cnt_e;
queue<ljl> q;
ljl dis[N],cnt[N];
bool vis[N],vis_in_dfs[N];
vector<ljl> vec[N];
struct E{
	ljl to,w,pre;
}e[M];
void add(ljl from,ljl to,ljl w)
{
	e[++cnt_e].to=to;
	e[cnt_e].w=w;
	e[cnt_e].pre=head[from];
	head[from]=cnt_e;
	return;
}
void dfs(ljl u)//暴力 dfs
{
	if(vis_in_dfs[u])return;
	vis_in_dfs[u]=1;
	for(auto i:vec[u])
		dfs(i);
	return;
}
bool spfa()
{
	for(ljl i=2;i<=n;++i)
		dis[i]=inf;
	q.push(1);vis[1]=1;
	while(!q.empty())
	{
		auto u=q.front();q.pop();
		vis[u]=0;
		for(ljl i=head[u];i;i=e[i].pre)
		{
			ljl v=e[i].to,w=e[i].w;
			if(!vis_in_dfs[v]) continue;//遇到了不可能在路径上的,直接跳过
			if(dis[v]<dis[u]+w)
			{
				dis[v]=dis[u]+w;
				if(!vis[v])
				{
					vis[v]=1;
					q.push(v);
					cnt[v]=cnt[u]+1;
					if(cnt[v]>=n)
						return 1;
				}
			}
		}
	}
	return 0;
}
int main(){
	ios::sync_with_stdio(0);
	cin>>n>>m>>p;
	for(ljl i=1,u,v,w;i<=m;++i)
	{
		cin>>u>>v>>w;
		add(u,v,w-p);vec[v].push_back(u);//正常的图和反图
	}
	dfs(n);
	if(spfa())
	{
		cout<<"-1\n";
		return 0;
	}
	cout<<max(0*1ll,dis[n])<<'\n';//记得和0取最大值,因为最后是扣光,而不是负债
	return 0;
}
相关推荐
机器人零零壹31 分钟前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
布莱克6052 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
ZhengEnCi3 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
前进的李工4 小时前
Agent 学习笔记 05:系统提示词应该怎么写
笔记·学习·prompt·agent·个人开发·few-shot·ai应用开发
取名真是4 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考4 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
正在走向自律5 小时前
【3/5】人工智能训练师 三级/高级工 考证学习方向:从“独立执行”到“设计、归因与全链条负责”
人工智能·学习·人工智能训练师·注方案设计·数据质控负责人·模型评测与调优辅助·ai训练项目交付
lzx_0026 小时前
Linux 进程(二) 深入理解进程
linux
沫璃染墨6 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
温暖小土6 小时前
在 CentOS 上安装 Redis Stack
linux·redis·centos