【JZOJ 3470】最短路【最短路】【DFS】

JZOJsenior3470.【NOIP2013模拟联考8】最短路(path) problemDescription给定一个n个点m条边的有向图,有k个标记点,要求从规定的起点按任意顺序经过所有标记点到达规定的终点,问最短的距离是多少。Input第一行5个整数n、m、k、s、t,表示点个数、边条数、标记点个数、起点编号、终点编号。接下来m行每行3个整数x、y、z,表示有一条从x到y的长为z的有向边。接下来k行每行一个整数表示标记点编号。Output输出一个整数,表示最短距离,若 阅读详情

题目大意:

题目链接:https://jzoj.net/senior/#main/show/3470
给定一个 n n n个点 m m m条边的有向图,有 k k k个标记点,要求从规定的起点按任意顺序经过所有标记点到达规定的终点,问最短的距离是多少。


思路:

最短路+DFS
首先,对于每一个标记点和 s s s点,以它们为起点跑一边SPFA,由于 k ≤ 10 k\leq10 k≤10,所以我们就可以得到一个只有 s s s和标记点的一个有向图,图的每条边是原图的最短路。
然后就用DFS枚举标记点经过的顺序,时间复杂度为 O ( k ! ) O(k!) O(k!),可以接受。跑完之后就更新答案,最后输出最优答案。
对于 k = 0 k=0 k=0的两个点,在跑完以 s s s为起点的最短路之后直接输出 d i s [ t ] dis[t] dis[t](或 − 1 -1 −1)即可。


代码:

有点丑,请见谅。

#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#define N 101000
#define Inf 1e9
#define ll_Inf 1e17
#define ll long long
using namespace std;

int n,m,k,s,t,tot,x,y,z,head[N],dis[N],sp[21],a[21][21];
bool vis[N],p[21];
ll ans=ll_Inf;

struct node
{
	int next,to,dis;
}e[N];

void add(int from,int to,int dis)  //存图(原图)
{
	tot++;
	e[tot].dis=dis;
	e[tot].to=to;
	e[tot].next=head[from];
	head[from]=tot;
}

void spfa(int start)  //以start为原点的SPFA
{
	for (int i=0;i<=n;i++)
	{
		dis[i]=Inf;
		vis[i]=0;
	}
	queue<int> q;
	q.push(start);
	vis[start]=1;
	dis[start]=0;
	while (q.size())
	{
		int u=q.front();
		q.pop();
		vis[u]=0;
		for (int i=head[u];~i;i=e[i].next)
		{
			int v=e[i].to;
			if (dis[v]>dis[u]+e[i].dis)
			{
				dis[v]=dis[u]+e[i].dis;
				if (!vis[v])
				{
					vis[v]=1;
					q.push(v);
				}
			}
		}
	}
}

void dfs(int x,ll sum,int dep)  //DFS枚举顺序
{
	if (dep==k)   //分配好所有k个点的顺序
	{
		if (a[x][k+1]==Inf) return;
		if (ans>sum+(ll)a[x][k+1]) ans=sum+(ll)a[x][k+1];  //更新答案(第k+1个点是终点)
		return;
	}
	for (int i=1;i<=k;i++)  //枚举下一个到达的点
	 if (x!=i&&!p[i])
	 {
	 	if (a[x][i]==Inf) continue;
	 	p[i]=1;
	 	dfs(i,sum+(ll)a[x][i],dep+1);
	 	p[i]=0;
	 }
}

int main()
{
	memset(head,-1,sizeof(head));
	scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
	for (int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
	}
	for (int i=1;i<=k;i++)
	 scanf("%d",&sp[i]);
	spfa(s);  //以s点为起点跑SPFA
	if (!k)  //k为0的特殊情况
	{
		if (dis[t]!=Inf) printf("%d\n",dis[t]);
		 else printf("-1");
		return 0;
	}
	for (int i=1;i<=k;i++)
	 a[0][i]=dis[sp[i]];  //求每个点的图
	for (int i=1;i<=k;i++)  //以每一个标记点开始跑SPFA
	{
		spfa(sp[i]);
		for (int j=1;j<=k;j++)
	 	 a[i][j]=dis[sp[j]];
	 	a[i][k+1]=dis[t];  //一定要记得连终点!!!
	}
	dfs(0,0,0);
	if (ans==ll_Inf) 
	{
		printf("-1");
		return 0;
	}
	cout<<ans;
	return 0;
}
DFS求最短路 题目:城市地图输入第一行表示有n个城市,m条马路。接下来m行是类似于a b c这样的数据,表示有一条路可以从城市a到b,且路程为c公里。需要注意的是这里的路都是单向的,也就是有向图。求出1号城市到n号城市的最短距离。分析:求最短路可以用DFS,BFS,Dijksrta,Floyed 等算法求解。目前在看图的遍历,就用DFS了。。。代码:#include &lt;iostream&gt; #incl... 阅读详情

相关推荐

学习图论(四)——单源最短路问题

一年前写的最短路的博客写得太一般了,代码也很难看,刚好最近复习到相关知识,所以重新整理一下 下面涉及题目的代码都在力扣上通过。 一、DFS DFS可以用来求给定两点之间的最短路。即走遍两点间的所有路径,选择路程最小的那一个 我们可以从U出发,记录已经走过的路程。 采用邻接矩阵的方式来表示图:graph[u][v]=w表示u到v之间有一条权重为w的边,若u和v之间无边,则令gr...

平凡 844

【图论·动态规划·习题】最短路

Problem 题目描述 给定一个n个点m条边的有向图,有k个标记点,要求从规定的起点按任意顺序经过所有标记点到达规定的终点,问最短的距离是多少。 输入格式 第一行5个整数n、m、k、s、t,表示点个数、边条数、标记点个数、起点编号、终点编号。 接下来m行每行3个整数x、y、z,表示有一条从x到y的长为z的有向边。 接下来k行每行一个整数表示标记点编号。 输出格式 输出一个整数,表示最短距离,若没...

Ronaldo7_ZYB的博客 1388

【JZOJ 3470】【NOIP2013模拟联考8】最短路(path) (spfa)

问题描述 给定一个n个点m条边的有向图,有k个标记点,要求从规定的起点按任意顺序经过所有标记点到达规定的终点,问最短的距离是多少。 输入 第一行5个整数n、m、k、s、t,表示点个数、边条数、标记点个数、起点编号、终点编号。 接下来m行每行3个整数x、y、z,表示有一条从x到y的长为z的有向边。 接下来k行每行一个整数表示标记点编号。 输出 输出一个整数,表示最短距离,若没有方案可行...

Fallen_Angel001的博客 679

nssl1141,jzoj3470-最短路【SPFA,暴力】

正题 纪中题目链接:https://jzoj.net/senior/#main/show/3470 题目大意 在从起点经过k个标记点然后到终点的最短路。 解题思路 用SPFA求出起点和所有标记点的最短路,然后暴力枚举标记点到达顺序。 时间负责度:O(K(N+M)+k!)O(K(N+M)+k!)O(K(N+M)+k!) code #include&lt;cst...

QuantAsk 515

pgsql行列转换

‌是PostgreSQL中的一个函数,用于将一个字符串根据正则表达式进行分割,并将结果返回为一个表格,每个分割后的部分作为一行‌‌。string_agg() 函数是 PostgreSQL 中的一个聚合函数,用于将一个列中的值连接成一个字符串。

chimchim66的博客 3502

获取气体传感器温度调制响应数据并转换为NumPy数组

本任务旨在获取气体传感器在温度调制条件下的响应数据,将其处理为结构化数据格式(NumPy数组),以便用于机器学习模型训练。整个过程包含数据采集、预处理、特征工程和格式转换等关键步骤。

huanghm88的专栏 1207

Jzoj P3470 最短路___分点spfa+dfs

题目大意: 一个nnn个点mmm条边的有向图,有kkk个标记点,要求从规定的起点SSS按任意顺序经过所有标记点到达规定的终点TTT,问最短的距离是多少。 n&lt;=50000,m&lt;=100000n&lt;=50000,m&lt;=100000n0&lt;=k&lt;=10,1&lt;=边权&lt;=50000&lt;=k&lt;=10,1&lt;=边权&lt;=50000SSS跟每个标...

生如夏花之绚烂 678

基于大模型的急性重症胰腺炎全流程预测与诊疗方案研究

本研究构建了基于大模型的急性重症胰腺炎(SAP)全流程预测与诊疗系统,实现了从术前风险评估到术后康复管理的精准诊疗闭环。通过整合临床信息、实验室检查和影像学等多源数据,模型在测试集上预测准确率达X%,AUC为X,显著优于传统评分系统。研究创新性地将预测结果应用于手术方案制定、麻醉决策、并发症防控及个性化护理,形成智能化诊疗方案。验证结果显示模型具有良好的稳定性和临床适用性,同时配套的健康教育体系提升了患者自我管理能力。尽管存在样本局限性和模型可解释性等不足,该研究为SAP的精准诊疗提供了新范式,未来可通过扩

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1115

JZOJ3470 最短路

Description   给定一个n个点m条边的有向图,有k个标记点,要求从规定的起点按任意顺序经过所有标记点到达规定的终点,问最短的距离是多少。 Input   第一行5个整数n、m、k、s、t,表示点个数、边条数、标记点个数、起点编号、终点编号。  接下来m行每行3个整数x、y、z,表示有一条从x到y的长为z的有向边。  接下来k行每行一个整数表示标记点编...

dengxiao3304的博客 180

Python 爬虫教程:企业官网基本信息抓取

本文介绍了使用Python爬虫技术抓取企业官网信息的方法,包括公司名称、简介、联系方式、地址、产品及新闻等数据。通过Requests和BeautifulSoup库实现网页请求与解析,并利用Pandas存储数据为CSV文件。同时提供了应对反爬虫机制(如设置User-Agent、代理IP池、延迟请求等)的解决方案,帮助高效获取企业公开数据。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1859

开源免费!ReaLTaiizor如何用MIT许可证打造专业级WinForm UI?

摘要: ReaLTaiizor是一款开源UI控件库,为WinForm应用提供现代化界面解决方案。支持100+组件、多主题切换(浅色/深色/自定义)和.NET 4.8-8.0全版本兼容,MIT许可证允许免费商用。通过NuGet快速安装,3步改造传统界面:1)注入主题(如this.Theme = new Dark()),2)替换原生控件为高颜值组件(如ModernGrid替代DataGridView),3)集成高级功能(分页/动画提示)。典型场景包括登录界面美化(进度动画+通知控件)和数据表格Material风

墨夶的博客 1521

JZOJ 3470

Description 给定一个n个点m条边的有向图,有k个标记点,要求从规定的起点按任意顺序经过所有标记点到达规定的终点,问最短的距离是多少。 Input 第一行5个整数n、m、k、s、t,表示点个数、边条数、标记点个数、起点编号、终点编号。 接下来m行每行3个整数x、y、z,表示有一条从x到y的长为z的有向边。 接下来k行每行一个整数表示标记点编号。 Output 输出...

weixin_30347335的博客 173

仿真学习系列(四十三):Sigrity仿真之平面谐振分析

在 SIGRITY 中,平面谐振分析(Plane Resonance Analysis)是一种用于分析信号完整性(SI)问题的高级仿真方法,尤其关注于层间电磁波的传播、谐振现象和信号衰减等问题。平面谐振分析通常用于电源分配网络(PDN)、信号线和参考平面之间的相互作用。本文将详细介绍如何在 SIGRITY 中进行平面谐振分析,并提供一些实用的分析方法与步骤,帮助工程师们识别和优化可能存在的设计问题。

案例文章,高速信号 480

YOLOv11改进 | 注意力篇 | YOLOv11引入24年最新的ELA注意力机制,并构建C2PSA_ELA

为了解决这些限制,本文介绍了一种高效的本地注意力(ELA)方法,实现了一个简单的结构,大幅度的性能改善。我们精心设计了ELA中的三个超参数,产生了四个不同的版本:ELA-T,ELAB,ELA-S和ELA-L,以满足不同视觉任务的具体要求,如图像分类,目标检测和语义分割。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

tsg6698的博客 1284

数据分析案例-汽车客户信息数据可视化分析

本数据集来源于kaggle,原始数据集共有8068条,11个特征变量,各变量含义解释如下:ID:客户IDGender:客户性别Ever_Married:客户婚姻状况Age:客户年龄Graduated:客户是毕业生吗?Profession:客户的职业Work_Experience:多年工作经验Spending_Score:客户的消费评分Family_Size:客户家庭成员人数(含客户)Var_1:客户的匿名类别Segmentation:(目标)客户的客户群。

m0_64336780的博客 1万+

20180219膜你赛题解

介于本场比赛题目难度并不按照难度顺序排列,所以题解顺序不同。 需要题面或数据可以私聊我QQ(不一定在):468170499. T3:最短路(path) 来源:jzoj3470 Describe: 给定一个n个点m条边的有向图,有k个标记点,要求从规定的起点按任意顺序经过所有标记点到达规定的终点,问最短的距离是多少。 Hint: 20%的数据n<=10。 50%的数据n<...

weixin_34006468的博客 252

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

2018.8.6提高B组模拟考试

爆零了...爽到 T1 题意简述:jzoj3470 Description 给定一个n个点m条边的有向图,有k个标记点,要求从规定的起点按任意顺序经过所有标记点到达规定的终点,问最短的距离是多少。 Input 第一行5个整数n、m、k、s、t,表示点个数、边条数、标记点个数、起点编号、终点编号。接下来m行每行3个整数x、y、z,表示有一条从x到y的长为z的有向...

weixin_34114823的博客 195

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

4706. 最短路程(dfs求最短路+思维)

接下来 n−1 行,每行包含三个整数 x,y,w,表示点 x 和点 y 之间存在一条双向边,长度为 w。我们可以发现,不论我们最终去哪个点,除去起点到达这个点的路径外,其他边我们都需要走两遍。你需要从 1 号点出发,沿着一条路径遍历树中所有点,路径中可以包含重复的点和边。所有测试点满足 1≤n≤10^5,1≤x,y≤n,0≤w≤2×10^4。请你计算,你所需的行程总长度的最小可能值。一个整数,表示行程总长度的最小可能值。注意,你可以在任意点结束你的行程。前 4 个测试点满足 1≤n≤5。

qq_64214980的博客 573

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

DFS和广度优先遍历求两点最短路

DFS求两点最短路。 给定2个点,from和to,代表出发点和结束点,求从from到to的一条最优路径。 从from点开始,以优先深度遍历整个图。 使用一个数组s,对于已经遍历过的顶点,标志为1,回溯的时候重置回0.为的是防止重复遍历图的某个环。 当该点对应的s数组为0时,递归下去决策该点。 package 两点最短路径; import java.util.ArrayList;

p13132312312的博客 1866

dfs求最短路径

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int a[51][51],book[51][51];//a数组储存地图,b数组标记有没有走过,防止重复走。int n,m,p,q,Min=99999999;in...

digu4869的博客 774

广度优先搜索BFS和深度优先搜索DFS查找最短路与最长路(C++实现)

文章目录1.广度优先搜索 Breadth First Search(BFS)1.图例2.c++实现代码2.深度优先搜索 Depth First Search(DFS)1.图例2.c++实现代码3.BFS与DFS的对比 1.广度优先搜索 Breadth First Search(BFS) 1.图例 举个例子,对于这张图: 我们想要知道从起点到终点最短需要多少步,采用广度优先搜索的方法: 1.将起点入队。 2.将队首元素向四周可拓展的点入队。如果没有可拓展的点,则说明该点是死路,该元素出队。 3.重复上述步

言念君君子的博客 2052

dfs + 最短路

传送门 TP. 题意 阿达莱王国有n座从1到n的城市。由于交通便利,任何两个城市之间都有一条双向公路。东京泽住在第一城。魔术师克拉丽斯住在n市,由于考试马上就要举行了,东京希望尽快营救CJB,所以她会选择最短的路径到达n市。 克拉里斯也听到了这个消息,害怕受到惩罚,所以他决定通过在他选择的k条道路上进行爆炸,使这些道路失去双向运输的能力,从而使德川泽慢下来,因为这可以为他有足够的时间准备对付东崎的强大魔法铺平道路。 德松子知道一些道路会被摧毁,并能立即识别出它们在哪里,但她没有办法阻止这次爆炸,所以她选择在

HHeyanjie的博客 675

dfs求最短路最长路

最近先后写到了应用dfs求图中的最短路径和最长路径的长度的题目,那就整理分享一下吧,对小白学习并应用dfs应该还是有些benefits的。使用dfs解决问题的时候,可以观察到数据量都比较小。如果数据量大的话应想想其他方法,用dfs容易时间超限。接下来m行是类似于a b c这样的数据,表示从城市a到b有一条路,路程为c公里。需要注意的是这里的路都是单向的,求出x号城市到y号城市的最短距离。表示有n个城市,m条马路。思路直接附在代码旁别啦,上代码。

2402_88126487的博客 566

【最短路算法】dijkstra,SPFA和folyd

在了解本知识点之前,首先要了解图的建立,也就是邻接表和邻接矩阵。邻接矩阵适用于稠密图邻接表适用于稀疏图。

he_Microsoft的博客 642
上一篇: 【JZOJ 3487】剑与魔法【贪心】【堆】
下一篇: 【洛谷P2199】最后的迷宫【BFS】【DFS】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值