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*的更多相关文章

  1. [poj2449]Remmarguts' Date(K短路模板题,A*算法)

    解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #includ ...

  2. poj 2499第K短路模板

    第k*短路模板(单项边) #include <iostream> #include <cstdio> #include <algorithm> #include & ...

  3. K短路模板POJ 2449 Remmarguts' Date

      Time Limit: 4000MS   Memory Limit: 65536K Total Submissions:32863   Accepted: 8953 Description &qu ...

  4. k短路模板 POJ2449

    采用A*算法的k短路模板 #include <iostream> #include <cstdio> #include <cstring> #include < ...

  5. ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven(第k短路模板)

    求第k短路模板 先逆向求每个点到终点的距离,再用dij算法,不会超时(虽然还没搞明白为啥... #include<iostream> #include<cstdio> #inc ...

  6. poj 2449 Remmarguts' Date (k短路模板)

    Remmarguts' Date http://poj.org/problem?id=2449 Time Limit: 4000MS   Memory Limit: 65536K Total Subm ...

  7. POJ 2449Remmarguts' Date 第K短路

    Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 29625   Accepted: 8034 ...

  8. POJ 2449 - Remmarguts' Date - [第k短路模板题][优先队列BFS]

    题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...

  9. poj 2449 Remmarguts' Date K短路+A*

    题目链接:http://poj.org/problem?id=2449 "Good man never makes girls wait or breaks an appointment!& ...

随机推荐

  1. QEMU启动时插入tap虚拟网卡

    1.利用brctl命令创建虚拟网桥br0 brctl addbr br0 ifconfig br0 up //上述两条命令分开执行会导致网络断开 2.将虚拟网桥br0与物理网卡eth0绑定 brctl ...

  2. 翻译《Writing Idiomatic Python》(一):if语句、for循环

    开篇废话 这是在美国Amazon上评价很不错的一本书,其实严格来说这可能不算书,而是一本小册子.就像书名一样,里面的内容主要是用一些例子讲述地道的Python的代码是怎样写的.书中把很多例子用不良风格 ...

  3. PHP header函数的几大作用

    先看看官方文档的定义 (PHP 4, PHP 5, PHP 7) header - 发送原生 HTTP 头 void header ( string $string [, bool $replace ...

  4. jquery.validate运用和扩展

    一.运用 默认校验规则 ().required:true 必输字段 ().remote:"remote-valid.jsp" 使用ajax方法调用remote-valid.jsp验 ...

  5. ntp时间同步服务器配置

    ntp同步的两种方式:1.使用ntpdate命令直接同步 2.使用NTPD服务平滑同步直接同步方式的缺陷:会导致已经做的定时任务再做一遍.平滑同步每次同步时间的偏移量不会太陡,根据偏移量,均方差等值每 ...

  6. SVM+HOG特征训练分类器

    #1,概念 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类.以及回归分析. SVM的主要思想可以概括为两点:⑴它是针 ...

  7. Nutch搜索引擎(第3期)_ Nutch简单应用

    1.Nutch命令详解 Nutch采用了一种命令的方式进行工作,其命令可以是对局域网方式的单一命令也可以是对整个Web进行爬取的分步命令. 要看Nutch的命令说明,可执行"Nutch&qu ...

  8. SimpleDateFormat非线程安全

    文章列表 1)SimpleDateFormat的线程安全问题与解决方案 2)深入理解Java:SimpleDateFormat安全的时间格式化

  9. LeetCode 笔记28 Maximum Gap

    Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...

  10. 20135220谈愈敏Linux Book_3

    第3章 进程管理 进程是Unix操作系统抽象概念中最基本的一种,进程管理是操作系统的心脏所在. 3.1 进程 进程:处于执行期的程序以及相关的资源的总称. 线程:在进程中活动的对象,拥有独立的程序计数 ...