【题解】绍兴一中-7.26-T3

本文分享了模拟赛T3题目的解题思路,通过优化的BFS算法,记录到达各点的最大体力值,减少冗余操作,实现从70分提升至90分的解题策略。

传送门
模拟赛的T3
没追求的我直接暴力BFS70分
很明显的需要记录状态 v i s [ u ] [ h p ] vis[u][hp] vis[u][hp],表示是否出现过到点u,体力为hp这种情况
70分没毛病

比较秒的小优化思想是记录之前到过每个点的体力最大值,这样BFS时如果体力大于目标点之前最大体力才入队,vis数组就不用搞了
减少了好多冗余操作,这样一优化可以过90分
最后一个点需要2.25s,暂且当它过了吧

Code:

// luogu-judger-enable-o2
#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
struct Edge{
	int to, next, len;
}edge[maxn << 1];
struct node{
	int u, hp, tim;
};
int n, m, M, num, head[maxn], R[maxn], maxhp[maxn];

inline int read(){
	int s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}

void addedge(int x, int y, int z){ edge[++num] = (Edge){ y, head[x], z }; head[x] = num; }

int main(){
	n = read(), m = read(), M = read();
	for (int i = 1; i <= n; ++i) R[i] = read();
	for (int i = 1; i <= m; ++i){
		int x = read(), y = read(), z = read();
		addedge(x, y, z); addedge(y, x, z);
	}
	maxhp[1] = M;
	queue <node> q; q.push((node) {1, M, 0});
	while (!q.empty()){
		node tmp = q.front(); q.pop();
		int u = tmp.u, hp = tmp.hp, tim = tmp.tim;
		for (int i = head[u]; i; i = edge[i].next){
			int v = edge[i].to, Hp = hp - edge[i].len;
			if (Hp <= 0) continue;
			Hp = min(Hp + R[v], M);
			if (Hp > maxhp[v]){
				maxhp[v] = Hp; q.push((node) {v, Hp, tim + 1});
				if (v == n){ printf("%d\n", tim + 1); return 0; }
			}
		}
	}
	puts("-1");
	return 0;
}

下面是std算法

我不想写了,直接来std代码:

#include <cstdio>
#include <algorithm>

using namespace std;

int edge[500000],next[500000],dist[500000],first[200000];
int b[200000],d[200000],g[10000000],h[10000000],p[200000],r[200000];
int i,k,m,n,x,y,z,head,tail,sum_edge;

int main()
{
	scanf("%d%d%d",&n,&m,&k);
	for (i=1;i<=n;i++)
		scanf("%d",&r[i]);
	for (i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		sum_edge++,edge[sum_edge]=y,next[sum_edge]=first[x],dist[sum_edge]=z,first[x]=sum_edge;
		sum_edge++,edge[sum_edge]=x,next[sum_edge]=first[y],dist[sum_edge]=z,first[y]=sum_edge;
	}
	d[1]=p[1]=k;
	tail++,g[tail]=1,h[tail]=0;
	for (head=1;head<=tail;head++)
	{
		if (g[head]==n)
		{
			printf("%d\n",h[head]);
			return 0;
		}
		if (h[head]!=h[head-1])
			for (i=head;i<=tail;i++)
				d[g[i]]=p[g[i]],b[g[i]]=0;
		for (i=first[g[head]];i!=0;i=next[i])
			if ((d[g[head]]>dist[i]) && (min(d[g[head]]-dist[i]+r[edge[i]],k)>p[edge[i]]))
			{
				p[edge[i]]=min(d[g[head]]-dist[i]+r[edge[i]],k);
				if (! b[edge[i]])
					tail++,g[tail]=edge[i],h[tail]=h[head]+1,b[edge[i]]=1;
			}
	}
	printf("-1\n");
	return 0;
}
内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值