POJ 2449Remmarguts' Date K短路模板 SPFA+A*
K短路模板,A*+SPFA求K短路。A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点加入堆中,维护堆,再从堆顶取当前g值最小的点(此时为第2短路),再添加相邻的点放入堆中,依此类推······保证第k次从堆顶取到的点都是第k短路(至于为什么,自己想)其实就是A*算法,这里太啰嗦了
1 #include<queue>
2 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int v[],v2[],c[],c2[],s,t,k,duin;
int n,m,point[],next[],cnt=,point2[],next2[],cnt2=;
int dist[],vis[],cont[],duig[],duiu[],duif[];
queue<int>q;
void insect(int u,int e,int z)
{cnt++; next[cnt]=point[u]; point[u]=cnt; v[cnt]=e; c[cnt]=z;}
void insect2(int u,int e,int z)
{cnt2++; next2[cnt2]=point2[u]; point2[u]=cnt2; v2[cnt2]=e; c2[cnt2]=z;}
void spfa()
{ int e,mp; while (!q.empty()) q.pop();
memset(vis,,sizeof(vis));
memset(dist,,sizeof(dist));
dist[t]=; vis[t]=; q.push(t);
while (!q.empty())
{
e=q.front(); q.pop(); vis[e]=;
for (mp=point2[e];mp!=;mp=next2[mp])
{
if (dist[v2[mp]]>dist[e]+c2[mp])
{
dist[v2[mp]]=dist[e]+c2[mp];
if (vis[v2[mp]]==)
{
vis[v2[mp]]=;
q.push(v2[mp]);
}
}
}
}
}
void swap(int &a,int &b){int c=a;a=b;b=c;}
void popdui()
{
duif[]=duif[duin]; duiu[]=duiu[duin]; duig[]=duig[duin];
duin--;
int i=;
while (i<duin)
{
if (((duif[i]<duif[i*])||(i*>duin))&&((duif[i]<duif[i*+])||(i*+>duin)))
return;
if (i*+<=duin)
if (duif[i*+]<duif[i*])
{ swap(duif[i],duif[i*+]);swap(duig[i],duig[i*+]);
swap(duiu[i],duiu[i*+]);i=i*+;}
else
{ swap(duif[i],duif[i*]);swap(duig[i],duig[i*]);
swap(duiu[i],duiu[i*]);i=i*;}
else
{ swap(duif[i],duif[i*]);swap(duig[i],duig[i*]);
swap(duiu[i],duiu[i*]);i=i*;}
}
}
void puss(int vv,int gg,int ff)
{
duin++;
duiu[duin]=vv;duig[duin]=gg;duif[duin]=ff;
int i=duin;
while (i>)
{
if (duif[i]<duif[i/])
{
swap(duif[i],duif[i/]);
swap(duiu[i],duiu[i/]);
swap(duig[i],duig[i/]);
}
else return;
i=i/;
}
}
int astar()
{
memset(cont,,sizeof(cont));
memset(duif,,sizeof(duif));
memset(duiu,,sizeof(duiu));
memset(duig,,sizeof(duig));
if (s==t) k++; cnt=;
int f,u,now,i; duin=;duif[]=dist[s];duiu[]=s;duig[]=;
while (duin>)
{
f=duif[]; u=duiu[]; now=duig[];
popdui();
if (u==t) cnt++;
if (cnt==k) return now;
for (i=point[u];i!=;i=next[i])
{
puss(v[i],now+c[i],now+c[i]+dist[v[i]]);
}
}
return -;
}
int main()
{
int i,j,a,b,cc;
while (scanf("%d %d\n",&n,&m)!=EOF)
{
memset(point,,sizeof(point)); memset(point2,,sizeof(point2));
memset(next,,sizeof(next)); memset(next2,,sizeof(next2));
memset(v,,sizeof(v)); memset(v2,,sizeof(v2));
memset(c,,sizeof(c)); memset(c2,,sizeof(c2));
cnt=; cnt2=;
for (i=;i<=m;++i)
{
scanf("%d %d %d\n",&a,&b,&cc);
insect(a,b,cc); insect2(b,a,cc);
} scanf("%d %d %d\n",&s,&t,&k);
spfa();
printf("%d\n",astar()); break;
}
return ;
}
POJ 2449Remmarguts' Date K短路模板 SPFA+A*的更多相关文章
- [poj2449]Remmarguts' Date(K短路模板题,A*算法)
解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #includ ...
- poj 2499第K短路模板
第k*短路模板(单项边) #include <iostream> #include <cstdio> #include <algorithm> #include & ...
- K短路模板POJ 2449 Remmarguts' Date
Time Limit: 4000MS Memory Limit: 65536K Total Submissions:32863 Accepted: 8953 Description &qu ...
- k短路模板 POJ2449
采用A*算法的k短路模板 #include <iostream> #include <cstdio> #include <cstring> #include < ...
- ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven(第k短路模板)
求第k短路模板 先逆向求每个点到终点的距离,再用dij算法,不会超时(虽然还没搞明白为啥... #include<iostream> #include<cstdio> #inc ...
- poj 2449 Remmarguts' Date (k短路模板)
Remmarguts' Date http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Total Subm ...
- POJ 2449Remmarguts' Date 第K短路
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 29625 Accepted: 8034 ...
- POJ 2449 - Remmarguts' Date - [第k短路模板题][优先队列BFS]
题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...
- poj 2449 Remmarguts' Date K短路+A*
题目链接:http://poj.org/problem?id=2449 "Good man never makes girls wait or breaks an appointment!& ...
随机推荐
- 【ASP.NET 进阶】根据IP地址返回对应位置信息
其实就是使用了百度的IP库的功能接口,然后处理下就行了,效果图如下: 准备工作: 1.注册成为开度开发者,创建应用获得百度API调用的AK秘钥,百度开发中心地址:http://developer.ba ...
- 如何用ZBrush雕刻出栩栩如生的头发(一)
之前的ZBrush教程我们学习了使用SubTool为模型添加了头发效果,本讲对模型头发雕刻技巧和细节进行调整.文章内容仅以fisker老师讲述为例,您也可以按照自己的想法,跟着老师的步调进行创作,发挥 ...
- 边工作边刷题:70天一遍leetcode: day 85-1
Inorder Successor in BST 要点:这题要注意的是如果不是BST,没法从树结构上从root向那边找p,只能遍历.而根据BST,可以只走正确方向 如果不检查right子树,可以从ro ...
- ZOJ 3829 Known Notation --贪心+找规律
题意:给出一个字符串,有两种操作: 1.插入一个数字 2.交换两个字符 问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*). 解法:仔细观察,发现如果数字够的话根本不用插入,数字够的最 ...
- 2014 Super Training #1 B Fix 状压DP
原题: HDU 3362 http://acm.hdu.edu.cn/showproblem.php?pid=3362 开始准备贪心搞,结果发现太难了,一直都没做出来.后来才知道要用状压DP. 题意: ...
- DoTween(HOTween V2) 教程
DoTween资料 官方网站:http://dotween.demigiant.com/ 下载地址:http://dotween.demigiant.com/download.php 快速开始:htt ...
- Android签名机制:生成keystore、签名、查看签名信息
转自:http://www.ourunix.org/post/146.html
- Html之初体验
概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言.相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器根据标记 ...
- 自定义WPF ListBox的选中项样式
首先介绍一种简单地方法:就是通过自定义SystemColors类的参数来自定义WPF ListBox选择颜色的,SystemColors的HighlightBrushKey和HighlightText ...
- linux patch 格式与说明(收录)
转:http://blog.chinaunix.net/uid-26813001-id-3282954.html 首先介绍一下diff和patch.在这里不会把man在线文档上所有的选项都介绍一下,那 ...