poj 2449

转自http://blog.csdn.net/sdj222555/article/details/7690081

 

题目大意就是给出一个图,然后给出一个起点个一个终点,求这两点间的第K短路。

本题中是可以走重复的路的,所以如果一张图中有一个环的话,无论求第几短路都是存在的。

 

网上大部分的方法都是用A* + 最短路的方法做的。  

对于A* ,估价函数 = 当前值+当前位置到终点的距离,即 F(p)=g(p)+h(p),每次扩展估价函数值中最小的一个。对于k短路来说,g(p)为当前从s到p所走的长度,h(p)为从p到 t 的最短路的长度,则F(p)的意义就是从s按照当前路径走到 p 后要走到终点 t 一共至少要走多远。也就是说我们每次的扩展都是有方向的扩展,这样就可以提高求解速度和降低扩展的状态数目。为了加速计算,h(p)需要从A*搜索之前进行预处理,只要将原图的所有边反向,再从终点 t 做一次单源最短路径就可以得到每个点的h(p)了。

在下面这个代码中

A结构体中,v代表的是当前走到的点,f和g分别为f函数和g函数的值,每次优先搜的是f函数较小的。这样就能保证搜索出来的一定是第K小短路,并且避免了一定的不必要计算。

 

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdlib>
  4 #include <cstdio>
  5 #include <queue>
  6 #define MAXN 1005
  7 #define MAXM 500005
  8 #define INF 1000000000
  9 using namespace std;
 10 struct node
 11 {
 12     int v, w, next;
 13 }edge[MAXM], revedge[MAXM];
 14 struct A
 15 {
 16     int f, g, v;
 17     bool operator <(const A a)const {
 18         if (a.f == f) return a.g < g;
 19         return a.f < f;
 20     }
 21 };
 22 int e, vis[MAXN], d[MAXN], q[MAXM * 5];
 23 int head[MAXN], revhead[MAXN];
 24 int n, m, s, t, k;
 25 void init()
 26 {
 27     e = 0;
 28     memset(head, -1, sizeof(head));
 29     memset(revhead, -1, sizeof(revhead));
 30 }
 31 void insert(int x, int y, int w)
 32 {
 33     edge[e].v = y;
 34     edge[e].w = w;
 35     edge[e].next = head[x];
 36     head[x] = e;
 37     revedge[e].v = x;
 38     revedge[e].w = w;
 39     revedge[e].next = revhead[y];
 40     revhead[y] = e++;
 41 }
 42 void spfa(int src)
 43 {
 44     for (int i = 1; i <= n; i++) d[i] = INF;
 45     memset(vis, 0, sizeof(vis));
 46     vis[src] = 0;
 47     int h = 0, t = 1;
 48     q[0] = src;
 49     d[src] = 0;
 50     while (h < t)
 51     {
 52         int u = q[h++];
 53         vis[u] = 0;
 54         for (int i = revhead[u]; i != -1; i = revedge[i].next)
 55         {
 56             int v = revedge[i].v;
 57             int w = revedge[i].w;
 58             if (d[v] > d[u] + w)
 59             {
 60                 d[v] = d[u] + w;
 61                 if (!vis[v])
 62                 {
 63                     q[t++] = v;
 64                     vis[v] = 1;
 65                 }
 66             }
 67         }
 68     }
 69 }
 70 int Astar(int src, int des)
 71 {
 72     int cnt = 0;
 73     priority_queue<A>Q;
 74     if (src == des) k++;
 75     if (d[src] == INF) return -1;
 76     A t, tt;
 77     t.v = src, t.g = 0, t.f = t.g + d[src];
 78     Q.push(t);
 79     while (!Q.empty())
 80     {
 81         tt = Q.top();
 82         Q.pop();
 83         if (tt.v == des)
 84         {
 85             cnt++;
 86             if (cnt == k) return tt.g;
 87         }
 88         for (int i = head[tt.v]; i != -1; i = edge[i].next)
 89         {
 90             t.v = edge[i].v;
 91             t.g = tt.g + edge[i].w;
 92             t.f = t.g + d[t.v];
 93             Q.push(t);
 94         }
 95     }
 96     return -1;
 97 }
 98 int main()
 99 {
100     int x, y, w;
101     while (scanf("%d%d", &n, &m) != EOF)
102     {
103         init();
104         for (int i = 1; i <= m; i++)
105         {
106             scanf("%d%d%d", &x, &y, &w);
107             insert(x, y, w);
108         }
109         scanf("%d%d%d", &s, &t, &k);
110         spfa(t);
111         printf("%d\n", Astar(s, t));
112     }
113     return 0;
114 }

 

转载于:https://www.cnblogs.com/usedrosee/p/4262396.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTS类型

类如果被封装&#xff0c;叫做密封类&#xff0c;密封类不能作为其他类的基类接口是抽象成员的集合&#xff0c;它在对象和对象用户间提供一个契约&#xff0c;CTS允许类实现任何数目的接口抽象类不能直接被创建&#xff0c;但可以用来为派生类型定义公共的行为&#xff0c;具体…

HDFS的常用操作

1、HDFS文件的权限以及读写操作 HDFS文件的权限&#xff1a; •与Linux文件权限类似 •r: read; w:write; x:execute&#xff0c;权限x对于文件忽略&#xff0c;对于文件夹表示是否允许访问其内容 •如果Linux系统用户zhangsan使用hadoop命令创建一个文件&#xff0c;那么这个文…

并行计算总结

作者&#xff1a;ArimaMisaki 目录 1 并行计算概述. 2 1.1 基本概念. 2 1.2 存储器的层次结构. 3 1.3 并行计算. 3 1.4 动态互连网络. 4 1.5 并行计算机结构模型. 5 1.6 并行算法的基本设计策略. 6 1.7 并行编程风范. 6 1.8 单核多线程和并发执行. 7 1.9 拓展&#x…

HDMI转MIPI DSI芯片方案TC358779XBG

型号&#xff1a;TC358779XBG功能&#xff1a;HDMI1.4转MIPI DSI通信方式&#xff1a;IIC分辨率&#xff1a;1920*1080电源&#xff1a;3.3/1.8/1.2封装形式&#xff1a;BGA80深圳长期现货 &#xff0c;提供技术支持&#xff0c;样品申请及规格书请联系蔡生M18312533639 Q1520…

基础总结篇之中的一个:Activity生命周期

子曰&#xff1a;溫故而知新&#xff0c;能够為師矣。《論語》 学习技术也一样&#xff0c;对于技术文档或者经典的技术书籍来说&#xff0c;指望看一遍就全然掌握&#xff0c;那基本不大可能&#xff0c;所以我们须要常常回过头再细致研读几遍&#xff0c;以领悟到作者的思想精…

数据结构杂谈(九)——二叉树的遍历

9 二叉树的遍历 文章目录9 二叉树的遍历9.1 递归函数基础9.2 深度优先遍历的实现9.3 二叉树层次遍历9.1 递归函数基础 什么是递归&#xff1f;调用自身就是叫递归&#xff0c;如下所示&#xff1a; void r(){r(); }我们习惯借用阶梯图来帮助我们理解这些知识。如果是同一层函数…

洛谷 P3750 [六省联考2017]分手是祝愿

传送门 题解 //Achen #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #include<queue> #include<cmath> const int N100000,mod100003; #define For(i,a,b)…

新书《编写可测试的JavaScript代码 》出版,感谢支持

本书介绍 JavaScript专业开发人员必须具备的一个技能是能够编写可测试的代码。不管是创建新应用程序&#xff0c;还是重写遗留代码&#xff0c;本书都将向你展示如何为客户端和服务器编写和维护可测试的JavaScript代码。从减少代码复杂性的方法&#xff0c;到单元测试、代码覆盖…

解决 error: command 'swig' failed with exit status 1

2019独角兽企业重金招聘Python工程师标准>>> # pip install docker-registry 分析&#xff1a;观察出现的错误&#xff0c;发现最开始报错的地方提示不能找到openssl的.h头文件。一般.h头文件都是放到/usr/inclue目录下的&#xff0c;而且头文件所在的安装包一般叫…

Android安全-SO动态库注入

2019独角兽企业重金招聘Python工程师标准>>> 关于这方面技术&#xff0c;网上已经有大把的实现。在此&#xff0c;我只是记录下自己的学习过程。 0x1 原理 所谓的SO注入就是将代码拷贝到目标进程中&#xff0c;并结合函数重定向等其他技术&#xff0c;最终达到监控或…

添加远程链接MySQL的权限

mysql> grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名用户地址 identified by ‘连接口令’;权限1,权限2,…权限n代表select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file等14个权限。当权限1,权限2,…权限n被…

C# Java间进行RSA加密解密交互(二)

接着前面一篇文章C# Java间进行RSA加密解密交互&#xff0c;继续探讨这个问题。 在前面&#xff0c;虽然已经实现了C# Java间进行RSA加密解密交互&#xff0c;但是还是与项目中要求的有所出入。在项目中&#xff0c;客户端&#xff08;Java&#xff09;的加密是通过这么一个方法…

BUG日志-2022.7.12——关于VSCode感叹号无法生成HTML骨架问题

解决办法&#xff1a;放弃使用多年的!&#xff0c;而采用html:5的形式。 原因&#xff1a;好像是因为VScode已经更新了 好多扩展也失效了。

hadoop 入门实例【转】

原文链接&#xff1a;http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 1、数据去重 "数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选。统计大数据集上的数据种类个数、从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据…

AWS安装CDH5.3-CentOS6.4中关键操作步骤

1、在AWS masternode 上下载cloudera-manager-installer.bin安装包 [rootip-172-21-42-114 ~]# wget http://archive.cloudera.com/cm5/installer/latest/coludera-manager-installer.bin 此时会提示&#xff1a;-bash: wget: command not find 所以要现安装wget命令 [rootip-1…

You have an error in your SQL syntax; check the manual that corresponds to...

问题缘由&#xff1a; 使用datagrip插入数据时发生报错 使用插入语句为&#xff1a; insert into ev_name (‘username’,‘password’) values (‘admin’,‘123456’); 错误提示&#xff1a; You have an error in your SQL syntax; check the manual that corresponds to …

Linux命令之文件相关

cd 绝对路径相对路径 --转到对应目录 touch-a --更新访问时间 touch -m --更新修改时间&#xff08;ls -l只能显示修改时间&#xff09; touch -t 【【cc】yy】mmddhhmm【ss】 --修改文件时间为任意时间0-68为20**&#xff0c;69-99为19**&#xff0c; touch 不存在的文件 --新…

省赛第一次选拔赛

就是第11届浙江省省赛的套题&#xff0c;总共11题&#xff0c;A了3题&#xff0c;排第25&#xff0c;中途就走了&#xff0c;其实那道同模取余题我是可以做出的&#xff0c;找规律我也想到了&#xff0c;但tmd我只打了30个的表&#xff0c;规律是第48个后出现&#xff0c;点背啊…

getaddrinfo ENOTFOUND 127.0.0.1:3306

错误缘由&#xff1a; 在写nodejs项目时&#xff0c;连接数据库发现找不到数据库。 解决&#xff1a; 发现数据库连接池没有设置端口号&#xff0c;需设置端口号3306。 解决效果&#xff1a; 成功解决

357. Count Numbers with Unique Digits

357. Count Numbers with Unique Digits Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Example:Given n 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding [11,22,3…