poj 2449 Remmarguts' Date【第K短路】
题意:求 点s 到 点t 的 第 k 短 路的距离;
估价函数=当前值+当前位置到终点的距离
f(n)=g(n)+h(n); g(n)表示g当前从s到p所走的路径的长度, h(n)‘启发式函数’,表示为终点t到其余一点p的路径长度;
(1)将有向图的所有边反向,以原终点t为源点,求解t到所有点的最短距离;
(2)新建一个优先队列,将源点s加入到队列中;
(3)从优先级队列中弹出f(p)最小的点p,如果点p就是t,则计算t出队的次数;
如果当前为t的第k次出队,则当前路径的长度就是s到t的第k短路的长度,算法结束;
否则遍历与p相连的所有的边,将扩展出的到p的邻接点信息加入到优先级队列;
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
const int Maxn = 10010;
const int INF = 1e9;
struct node{
int to,val;
node(){}
node(int a,int b)
{
to = a; val = b;
}
};
vector<node> adj[Maxn],_adj[Maxn];
int n,m,k;
bool vis[Maxn];
int dis[Maxn];
void AddEdge(int x,int y,int val)
{
adj[x].push_back(node(y,val));
_adj[y].push_back(node(x,val));//反向存图
}
void Dijkstra(int s,int t)
{
priority_queue<int, vector<int>,greater<int> > q;
while(!q.empty()) q.pop();
for(int i=1;i<=n;i++)
vis[i]=false,dis[i]=INF;
vis[t]=true;dis[t]=0;q.push(t);
int u,len;
while(!q.empty())
{
u = q.top(); q.pop();
len = _adj[u].size();
for(int i=0;i<len;i++)
{
node v = _adj[u][i];
if(dis[v.to]>dis[u]+v.val)
{
dis[v.to]=dis[u]+v.val;
if(!vis[v.to])
{
q.push(v.to);
vis[v.to]=true;
}
}
}
vis[u]= false;
}
}
struct Anode{
int h,g,id;
Anode(int a,int b,int c){h=a;g=b;id=c;}
bool operator < (Anode a) const{
return h+g > a.h + a.g;
}
};
priority_queue<Anode> Q;
int Astar(int s,int t) //A*算法
{
while(!Q.empty()) Q.pop();
Q.push(Anode(0,dis[s],s));
int len,num;
num=0;
while(!Q.empty())
{
Anode u = Q.top();
Q.pop();
if(u.id==t) ++num;
if(num>=k) return u.h;
len = adj[u.id].size();
for(int i=0;i<len;i++)
{
node v = adj[u.id][i];
Q.push(Anode(u.h+v.val,dis[v.to],v.to));
}
}
return -1;
}
int main()
{
while(scanf("%d%d",&n,&m)!=-1)
{
for(int i=0;i<Maxn;i++)
adj[i].clear(),_adj[i].clear();
int x,y,v,s,t;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&v);
AddEdge(x,y,v);
}
scanf("%d%d%d",&s,&t,&k);
if(s==t) k++;
Dijkstra(s,t);
printf("%d\n",Astar(s,t));
}
return 0;
}
/*
2 2
1 2 5
2 1 4
1 2 2
*/
poj 2449 Remmarguts' Date【第K短路】的更多相关文章
- poj 2449 Remmarguts' Date (k短路模板)
Remmarguts' Date http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Total Subm ...
- 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短路 (最短路变形)
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 33606 Accepted: 9116 ...
- poj 2449 Remmarguts' Date(K短路,A*算法)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013081425/article/details/26729375 http://poj.org/ ...
- POJ 2449 Remmarguts' Date ( 第 k 短路 && A*算法 )
题意 : 给出一个有向图.求起点 s 到终点 t 的第 k 短路.不存在则输出 -1 #include<stdio.h> #include<string.h> #include ...
- 【POJ】2449 Remmarguts' Date(k短路)
http://poj.org/problem?id=2449 不会.. 百度学习.. 恩. k短路不难理解的. 结合了a_star的思想.每动一次进行一次估价,然后找最小的(此时的最短路)然后累计到k ...
- 【POJ】2449.Remmarguts' Date(K短路 n log n + k log k + m算法,非A*,论文算法)
题解 (搬运一个原来博客的论文题) 抱着板题的心情去,结果有大坑 就是S == T的时候也一定要走,++K 我发现按照论文写得\(O(n \log n + m + k \ log k)\)算法没有玄学 ...
- poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)
http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Subm ...
- poj 2449 Remmarguts' Date K短路+A*
题目链接:http://poj.org/problem?id=2449 "Good man never makes girls wait or breaks an appointment!& ...
- 图论(A*算法,K短路) :POJ 2449 Remmarguts' Date
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 25216 Accepted: 6882 ...
随机推荐
- Oracle_PL/SQL(6) 触发器(序列、视图)
序列1.创建序列create sequence seq_alog start with 1 increment by 1 maxvalue 999999999999999999999999999 mi ...
- 使用 Spring 2.5 注释驱动的 IoC 功能
概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...
- 简易Java文本编译器(C++)
如何使用VS写一个Java的文本"编译器 "? 所需程序: 1.Visual Studio 2.JDK 你是否因为习惯于使用VS编译C/C++程序,在学java的时候改用新编译器而 ...
- BZOJ3669 膜法森林 - LCT
Solution 非常妙的排序啊... 仔细想想好像确实能够找出最优解QUQ 先对第一关键字排序, 在$LCT$ 维护第二关键字的最大值 所在的边. 添边时如果$u, v$ 不连通 就直接加边. 如 ...
- UI设计师如何提升审美?
不得不承认,作为一名设计师,独特的审美能力是设计的灵感所在,不过很多刚刚从事UI设计的人,审美能力真的非常的一般,所以心中难免有这样的疑问,我的审美能通过后天的努力提升吗?关于这点,可以非常肯定的说, ...
- 【UI测试】--美观与协调性
- jquery plugin 之 form表单验证插件
基于h5表单验证系统.扩展了对easyui组件的支持 先上图: 提示样式用到了伪对象的 {content: attr(xxx)}函数方法,实现提示信息能动态切换. 1.关键属性说明: type: 表单 ...
- openssl初步使用
centos平台 md5.c #include <stdio.h> #include <string.h> #include <stdlib.h> //#inclu ...
- 利用PHP脚本辅助MySQL数据库管理4-两个库表结构差异比较
<?php define('DATABASE1', 'coffeetest'); $dbi1 = new DbMysql; $dbi1->dbh = 'mysql://root:mysql ...
- rowspan和colspan的区别粗解
rowspan和colspan是我们初学HTML表格中会在做一些特殊表格中遇到.其常在td中添加. rowspan的作用是指定纵向所跨越单元格的行数. 如下效果. colspan的作用是指定单元格横向 ...