hdu Minimum Transport Cost(按字典序输出路径)

2024-08-28 10:38

本文主要是介绍hdu Minimum Transport Cost(按字典序输出路径),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://acm.hdu.edu.cn/showproblem.php?pid=1385


求最短路,要求输出字典序最小的路径。


spfa:拿一个pre[]记录前驱,不同的是在松弛的时候,要考虑和当前点的dis值相等的情况,解决的办法是dfs找出两条路径中字典序较小的,pre[]去更新。把路径当做字符串处理。

我只用之前的pre去更新当前点,并没考虑到起点到当前点的整个路径,其实这样并不能保证是字典序最小。wa了N次,于是乎搜了下题解,发现用spfa解的很少,看到了某大牛的解法如上,感觉很赞的想法。


#include <stdio.h>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#define LL long long
#define _LL __int64
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 110;int n;
int tax[maxn];
int Map[maxn][maxn];
int dis[maxn],inque[maxn];
int pre[maxn];
int pos = 0;void dfs(int u, char *s)
{if(u == -1)return;dfs(pre[u],s);s[pos++] = u+'0';
}bool solve(int v, int u)
{char s1[maxn],s2[maxn];//寻找先前的路径pos = 0;dfs(v,s1);s1[pos] = '\0';//寻找由u更新的路径pos = 0;dfs(u,s2);s2[pos++] = v+'0';s2[pos] = '\0';if(strcmp(s1,s2) > 0) return true;return false;}int spfa(int s, int t)
{queue <int> que;memset(dis,INF,sizeof(dis));memset(inque,0,sizeof(inque));memset(pre,-1,sizeof(pre));dis[s] = 0;inque[s] = 1;que.push(s);while(!que.empty()){int u = que.front();que.pop();inque[u] = 0;for(int v = 1; v <= n; v++){if(Map[u][v] > 0){int tmp = dis[u] + Map[u][v] + tax[v];if(tmp < dis[v])//直接更新{dis[v] = tmp;pre[v] = u;if(!inque[v]){inque[v] = 1;que.push(v);}}else if(tmp == dis[v] && solve(v,u)){pre[v] = u;}}}}return dis[t];
}void output(int s, int t)
{int res[maxn];int cnt = 0;int tmp = t;while(pre[tmp] != -1){res[cnt++] = tmp;tmp = pre[tmp];}res[cnt] = s;printf("Path: ");for(int i = cnt; i >= 1; i--)printf("%d-->",res[i]);printf("%d\n",res[0]);
}int main()
{while(~scanf("%d",&n) && n){for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++)scanf("%d",&Map[i][j]);}for(int i = 1; i <= n; i++)scanf("%d",&tax[i]);int u,v;while(~scanf("%d %d",&u,&v)){if(u == -1 && v == -1) break;int tmp1 = tax[u];//备份int tmp2 = tax[v];tax[u] = 0;tax[v] = 0;printf("From %d to %d :\n",u,v);int ans = spfa(u,v);output(u,v);printf("Total cost : %d\n\n",ans);//恢复备份tax[u] = tmp1;tax[v] = tmp2;}}return 0;
}



floyd:pre[i][j]记录i到j路径上距离i最近的点,输出路径时按pre正向输出。感觉floyd很强大啊,还可以这样记录路径。


#include <stdio.h>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#include <stack>
#include <queue>
#define LL long long
#define _LL __int64
using namespace std;const int INF = 0x3f3f3f3f;
const int maxn =  110;
int Map[maxn][maxn];
int tax[maxn];
int pre[maxn][maxn];
int n;void floyd()
{//初始化for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)pre[i][j] = j;for(int k = 1; k <= n; k++){for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){if(Map[i][k] > 0 && Map[k][j] > 0){int tmp = Map[i][k] + Map[k][j] + tax[k];if(tmp < Map[i][j]) //小于直接更新{Map[i][j] = tmp;pre[i][j] = pre[i][k];}else if(tmp == Map[i][j]) {pre[i][j] = min(pre[i][k],pre[i][j]);}}}}}
}void output(int s, int t)
{printf("Path: ");int tmp = s;while(tmp != t){printf("%d-->",tmp);tmp = pre[tmp][t];}printf("%d\n",t);}int main()
{while(~scanf("%d",&n) && n){for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++){scanf("%d",&Map[i][j]);if(Map[i][j] == -1)Map[i][j] = INF;}for(int i = 1; i <= n; i++)scanf("%d",&tax[i]);int u,v;floyd();while(~scanf("%d %d",&u,&v)){if(u == -1 && v == -1) break;printf("From %d to %d :\n",u,v);output(u,v);printf("Total cost : %d\n\n",Map[u][v]);}}return 0;
}



这篇关于hdu Minimum Transport Cost(按字典序输出路径)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114527

相关文章

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D