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

相关文章

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

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,