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!& ...
随机推荐
- [转]关于负margin在页面中布局的应用
本文转载自:http://www.cnblogs.com/jscode/archive/2012/08/28/2660078.html. 今天再写一个布局的时候用到一个margin-top是负值的情况 ...
- 在3D Max中查看模型引用的贴图
需求 假如在Max中有一个模型,想查看贴图 操作步骤 1.右上角点击 2.在弹出材质编辑器中 点击吸管 3.把吸管点击在角色模型上,然后点击M 4.点击查看图像 5.就能查看到模型使用的贴图
- QC学习三:Excel数据导入导出QC操作流程
环境: QC9 WindowsXP Office2007 1. 准备 1.通过Excel导入QC,需要下载Microsoft Excel Add-in: http://update.externa ...
- Oracle导入导出dmp文件
目 录 目 录...3 1 说明...3 2 导出dmp文件...3 3 导入dmp文件...5 3.1 环境准备...5 ...
- android窗口泄漏,isInEditMode解决可视化编辑器无法识别自定义控件的问题
android窗口泄漏 在做项目是遇到这个错误:google:WindowManager: Activity has leaked window. 产 生原因:我们知道Android的每一个Activ ...
- poj 1046 Color Me Less
Color Me Less Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33007 Accepted: 16050 D ...
- mac 无法连接android手机进行调试 解决方案
第一步: 查看usb设备信息 在 终端输入:system_profiler SPUSBDataType 可以查看连接的usb设备的信息 比如我的usb信息如下(部分内容): Android: ...
- 通信vue2.0组件
vue2.0组件通信各种情况总结与实例分析 Props在vue组件中各种角色总结 在Vue中组件是实现模块化开发的主要内容,而组件的通信更是vue数据驱动的灵魂,现就四种主要情况总结如下: 使用p ...
- 0.1 hint crack
http://files.cnblogs.com/files/crac/27.rar
- c++中二进制和整数转化
#1,包含文件 #include<bitset> #2,整数转化成二进制 int a = 63; bitset<6> bs(a); #3,二进制转化成整数 int b = bs ...