HDU6181-求解次短路-A*或者dijkstra
(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦
题意:传送门
原题目描述在最下面。
次短路裸题。
思路:
在dijstra的过程过维护两个数组变量:\(dis1[],dis2[]\)。分别表示到达\(i\)节点的最短距离和次短距离。
如果当前距离大于次短距离,则更新次短距离。如果更新后次短距离小于最短距离,就交换二者的值。到最后两个数组值就更新就完成了。
AC代码:
dijkstra
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<string>
#include<cmath>
#define test printf("***\n")
#define ka getchar();getchar()
#define ka1 getchar()
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
const int N = 100005;
const int INF = 0x3f3f3f3f;
const LL mod = 10000;
const double eps = 1e-8;
struct lp{
int to;
LL w;
lp(int a,LL b){to=a;w=b;}
bool operator <(const lp &a)const {
if(w!=a.w) return w>a.w;
return to<a.to;
}
};
vector<lp>mp[N];
LL dis1[N],dis2[N];
int n,m;
void init(){
for(int i=0;i<=n;++i)mp[i].clear();
}
void dij(int s){
memset(dis1,0x3f,sizeof(dis1));
memset(dis2,0x3f,sizeof(dis2));
dis1[s]=0;
priority_queue<lp>Q;
Q.push(lp(s,0));
while(!Q.empty() ){
lp x=Q.top();Q.pop();
int u=x.to;
if(dis2[u]<x.w)continue;
for(int i=0;i<mp[u].size();++i){
lp y=mp[u][i];
if(dis2[y.to]>(x.w+y.w)){
dis2[y.to]=x.w+y.w;
Q.push(lp(y.to,dis2[y.to]));
}
if(dis2[y.to]<dis1[y.to]){
swap(dis2[y.to],dis1[y.to]);
}
}
}
printf("%lld\n",dis2[n]);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int a,b,c;
scanf("%d%d",&n,&m);
init();
for(int i=0;i<m;++i){
scanf("%d%d%d",&a,&b,&c);
mp[a].push_back(lp(b,c));
mp[b].push_back(lp(a,c));
}
dij(1);
}
return 0;
}
A*
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<assert.h>
#include<bitset>
#include<vector>
#include<queue>
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) (x)&(-(x))
#define all(x) (x).begin(),(x).end()
#define mk make_pair
#define pb push_back
#define fi first
#define se second
using namespace std;
typedef long long LL;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int N = (int)1e5 +107;
int n, m, k, st, ed;
int vis[N],time[N];
LL dis[N];
struct lp{
LL f,g;
int v;
friend bool operator <(const lp &a,const lp &b){
if(a.f==b.f)return a.g>b.g;
return a.f>b.f;
}
}aa,bb;
struct lh{
int v,nex;
LL w;
}cw[200000+5],rev[200000+5];
int head[N],tot,headd[N],tum;
int q[2500005];
void add(int u,int v,LL w){
cw[++tot].v=v;cw[tot].nex=head[u];cw[tot].w=w;
head[u]=tot;
rev[++tum].v=u;rev[tum].nex=headd[v];rev[tum].w=w;
headd[v]=tum;
}
void spfa(){
for(int i = 1; i <= n; i++) dis[i] = INF;
memset(vis, 0, sizeof(vis));
int h = 0, t = 1;
q[0] = ed;
dis[ed] = 0;
while(h < t){
int u = q[h++];
vis[u] = 0;
for(int i = headd[u] ; ~i ; i = rev[i].nex){
int v = rev[i].v;
LL w = rev[i].w;
if(dis[v] > dis[u] + w){
dis[v] = dis[u] + w;
if(!vis[v]){
q[t++] = v;
vis[v] = 1;
}
}
}
}
}
LL Astar(){
if(dis[st]==INF)return -1;
memset(time,0,sizeof(time));
aa.v=st;aa.f=dis[st];aa.g=0;
priority_queue<lp>Q;
Q.push(aa);
while(!Q.empty()){
bb = Q.top();Q.pop();
int u = bb.v;
time[u]++;
if(time[u]==k&&u==ed)return bb.g;
if(time[u]>k)continue;
for(int i=head[u];~i;i=cw[i].nex){
int v = cw[i].v;
aa.v = v;
aa.g=bb.g+cw[i].w;
aa.f=aa.g+dis[v];
Q.push(aa);
}
}
return -1;
}
int main(){
int tim;
scanf("%d",&tim);
while(tim--){
scanf("%d%d", &n, &m);
tot=tum=-1;
memset(head,-1,sizeof(head));
memset(headd,-1,sizeof(headd));
for(int i = 0, u, v; i < m; ++i){
LL w;
scanf("%d%d%lld", &u, &v, &w);
add(u,v,w);add(v,u,w);
}
st=1;ed=n;
k=2;
spfa();
if(st == ed)k++;
printf("%lld\n", Astar());
}
return 0;
}
####原题目描述:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<string>
#include<cmath>
#define test printf("***\n")
#define ka getchar();getchar()
#define ka1 getchar()
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
const int N = 100005;
const int INF = 0x3f3f3f3f;
const LL mod = 10000;
const double eps = 1e-8;
struct lp{
int to;
LL w;
lp(int a,LL b){to=a;w=b;}
bool operator <(const lp &a)const {
if(w!=a.w) return w>a.w;
return to<a.to;
}
};
vector<lp>mp[N];
LL dis1[N],dis2[N];
int n, m, pre[N];
void init(){
for(int i=0;i<=n;++i)mp[i].clear();
}
void dij(int s,LL *dis){
dis[s]=0;
priority_queue<lp>Q;
Q.push(lp(s,0));
while(!Q.empty() ){
lp x=Q.top();Q.pop();
int u=x.to;
for(int i=0;i<mp[u].size();++i){
lp y=mp[u][i];
if(dis[y.to]>(x.w+y.w)){
dis[y.to]=x.w+y.w;
pre[y.to]=u;
Q.push(lp(y.to,dis[y.to]));
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int a,b,c;
scanf("%d%d",&n,&m);
init();
for(int i=0;i<m;++i){
scanf("%d%d%d",&a,&b,&c);
mp[a].push_back(lp(b,c));
mp[b].push_back(lp(a,c));
}
memset(dis1,0x3f,sizeof(dis1));
memset(dis2,0x3f,sizeof(dis2));
dij(n,dis2);
memset(pre,0,sizeof(pre));
dij(1,dis1);
LL ans = 1e18;
for(int i=1;i<=n;++i){
for(int j=0;j<mp[i].size();++j){
int v= mp[i][j].to;
LL tmp =dis1[i]+dis2[v]+mp[i][j].w;
if(pre[v]!=i){
if(tmp<ans){
ans=tmp;
}
}
}
}
printf("%lld\n", ans);
}
return 0;
}
HDU6181-求解次短路-A*或者dijkstra的更多相关文章
- ACM-最短路(SPFA,Dijkstra,Floyd)之最短路——hdu2544
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- Bellman-ford算法、SPFA算法求解最短路模板
Bellman-ford 算法适用于含有负权边的最短路求解,复杂度是O( VE ),其原理是依次对每条边进行松弛操作,重复这个操作E-1次后则一定得到最短路,如果还能继续松弛,则有负环.这是因为最长的 ...
- ACM - 最短路 - AcWing 849 Dijkstra求最短路 I
AcWing 849 Dijkstra求最短路 I 题解 以此题为例介绍一下图论中的最短路算法.先让我们考虑以下问题: 给定一个 \(n\) 个点 \(m\) 条边的有向图(无向图),图中可能存在重边 ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- BZOJ-1922 大陆争霸 多限制、分层图最短路 (堆+dijkstra)
1922: [Sdoi2010]大陆争霸 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1154 Solved: 478 [Submit][Status ...
- POJ 1797 Heavy Transportation 最短路变形(dijkstra算法)
题目:click here 题意: 有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量.分析: 其实这个求最大边可以 ...
- 最短路算法之Dijkstra算法通俗解释
Dijkstra算法 说明:求解从起点到任意点的最短距离,注意该算法应用于没有负边的图. 来,看图. 用邻接矩阵表示 int[][] m = { {0, 0, 0, 0, 0, 0}, {0, 0, ...
- 【最短路算法】Dijkstra+heap和SPFA的区别
单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...
- CCPC-Wannafly Winter Camp Day1 Div1 - 爬爬爬山 - [最短路][堆优化dijkstra]
题目链接:https://zhixincode.com/contest/3/problem/F?problem_id=39 样例输入 1 4 5 1 1 2 3 4 1 2 1 1 3 1 1 4 ...
- 基础最短路(模板 dijkstra)
Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多 ...
随机推荐
- PHP FILTER_SANITIZE_NUMBER_INT 过滤器
定义和用法 FILTER_SANITIZE_NUMBER_INT 过滤器删除数字中所有非法的字符. 该过滤器允许所有数字以及 . + - Name: "number_int" ID ...
- 【dart学习】-- Dart之函数
1. 指定返回值得函数 /** * 无返回值的函数 * params: 可以是任意类型(var和Object类型也可以任意类型). 当然这里的参数类型你可以随意指定我这里已dynamic为例 * 参数 ...
- cf期望概率专题
cf1009E:求到第i段期望和的比较困难,但是单独求每段的期望是比较容易的,所以单独对每段求和,然后累计总和 E[i]=1/2*a1+1/4*a2+...+1/2^(i-1)*ai-1+1/2^(i ...
- PHP反序列化漏洞研究
序列化 序列化说通俗点就是把一个对象变成可以传输的字符串 php serialize()函数 用于序列化对象或数组,并返回一个字符串.序列化对象后,可以很方便的将它传递给其他需要它的地方,且其类型和结 ...
- Codeforces ~ 1009C ~ Annoying Present (贪心)
题意 一个长度为n的数组(初始全为0),进行m次操作. 操作:给你x,d,你任意挑选一个 i (1~n),每个数字加上 x+|i-j|*d( j 表示对应数字的下标) 问m次操作后的最大算术平均值为多 ...
- spring aop的前奏,动态代理 (5)
目录 一.先看一个计算器的抽取和实现 二.使用动态代理解决以上问题. 1 设计原理 2 代码实现 2.1 接口代码 2.2 实现接口的代码 2.3 测试代码 2.3 创建动态代理类 2.4 动态代理类 ...
- Dubbo入门到精通学习笔记(十二):Dubbo消费端直连提供者(开发调试)、Dubbo服务只订阅(开发调试)、Dubbo服务只注册
文章目录 Dubbo消费端直连提供者(开发调试) Dubbo服务只订阅(开发调试) Dubbo服务只注册 Dubbo消费端直连提供者(开发调试) Dubbo 官方文档: 用户指南 >> 示 ...
- (转载)js调用打印机 打印整体或部分
本文转载自:https://www.cnblogs.com/lfhy/p/6802781.html 以下为原文内容: 有时前端的项目中需要添加打印的功能,首先要知道打印分为整体打印和局部打印两种,而局 ...
- 前端(八)—— 高级布局:文档流、浮动布局、流式布局、定位布局、flex布局、响应布局
高级布局:文档流.浮动布局.流式布局.定位布局.flex布局.响应布局 一.文档流 1.什么是文档流 将窗体自上而下分成一行一行,块级元素从上至下.行内元素在每行中从左至右的顺序依次排放元素 2.本质 ...
- js 中typeof 检测数据类型的时候需要注意的小细节
博客搬迁给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/10/26/typeof-%E6%A3%80%E6%B5%8B%E6%95%B0%E6%8D% ...