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!& ...
随机推荐
- make命令--基础
一.Make的概念 Make这个词,英语的意思是"制作".Make命令直接用了这个意思,就是要做出某个文件.比如,要做出文件a.txt,就可以执行下面的命令. $ make a.t ...
- 《The Django Book》实战--第二章--动态网页基础
这章演示了一些最基本的Django开发动态网页的实例,由于版本不一样,我用的是Django 1.,6.3,有些地方按书上的做是不行的,所以又改了一些,写出来让大家参考. 这是一个用python写的一个 ...
- 如何查看windows xp系统的位数?
1.右击“我的电脑”->属性,可以看到.2.运行dxdiag,在操作系统一行可以看到.3.运行cmd,输入systeminfo,在系统类型一栏可以看到.--简单4.使用一些检测软件也可以看,像鲁 ...
- Cookie测试工具小汇
现在很多网站都用到Cookies,特别是用户的登陆以及购物网站的购物车. Cookies 通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies 访问了某一个应用系统时,Web 服 ...
- .Net 项目代码风格要求小结
代码风格没有正确与否,重要的是整齐划一,这是我拟的一份<.Net 项目代码风格要求>,供大家参考. 1. C# 代码风格要求1.1注释 类型.属性.事件.方法.方法参数,根据需要添加注释. ...
- Ubuntu安装JDK与配置环境变量
Ubuntu14.04安装JDK与配置环境变量 工具/原料 Ubuntu14.04系统 方法/步骤 先从Oracle官网下载JDK.先选择同意按钮,然后根据自己的系统下载相应版本.我的系统 ...
- android ContentResolver详解
查询出来的cursor的初始位置是指向第一条记录的前一个位置的cursor.moveToFirst()指向查询结果的第一个位置.一般通过判断cursor.moveToFirst()的值为true或fa ...
- Linux Linux程序练习六
题目:实现一个so库文件名称为listupper.so,so文件中实现一个函数,函数名为void upper(const char *src, char *desc),调用update后将参数src所 ...
- Resource interpreted as Script but transferred with MIME type text/plain:
我用script做ajax跨域,请求返回的是个文本字符串,chrome提示:Resource interpreted as Script but transferred with MIME type ...
- OC格式化标准符
%@ 对象 • %d, %i 整数 • %u 无符整形 • %f 浮点/双字 • %x, %X ...