poj 2449 第k短路径
思路:
利用一个估计函数g[i]=dis[i]+len。其中len为队列出来的点当前已经走了的距离。dis[i]为该点到终点的最短路径。这样我们只要将点按g[i]的升序在队列你排序,每次取出最小的g[i]值的点。其意义就是每次找最短的能到终点的点。第一次找到就是最短路径,第二次就是就是第二短,第三次就是...顺推
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#define Maxn 1010
#define Maxm 200200
#define inf 10000000
using namespace std;
int dis[Maxn],vi[Maxn],head[Maxn],e,map[Maxn][Maxn],n,m,cnt[Maxn];
struct Edge{
int u,v,next,val;
}edge[Maxm];
struct Point{
int u,len;
int operator <(const Point &temp) const
{
return len+dis[u]>temp.len+dis[temp.u];
}
};
void init()
{
e=;
memset(dis,,sizeof(dis));
memset(vi,,sizeof(vi));
memset(head,-,sizeof(head));
memset(cnt,,sizeof(cnt));
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
map[i][j]=inf;
}
}
void add(int u,int v,int val)
{
edge[e].v=v;edge[e].val=val;edge[e].next=head[u];head[u]=e++;
map[v][u]=(val<map[v][u]?val:map[v][u]);
}
void dijkstra(int s)
{
int i,j,u;
for(int i=;i<=n;i++)
dis[i]=inf,vi[i]=;
for(i=;i<=n;i++)
dis[i]=map[s][i];
dis[s]=;
for(i=;i<=n;i++)
{
int min=inf;
for(j=;j<=n;j++)
if(!vi[j] && dis[j]<=min)
{
u=j;
min=dis[j];
}
if(min==inf) break;
vi[u]=;
for(j=;j<=n;j++)
{
if(!vi[j]&&dis[j]>dis[u]+map[u][j])
dis[j]=dis[u]+map[u][j];
}
}
}
int A_star(int s,int t,int k)
{
priority_queue<Point> q;
memset(vi,,sizeof(vi));
Point a,p;
a.u=s,a.len=;
q.push(a);
while(!q.empty())
{
a=q.top();
q.pop();
vi[a.u]++;
if(vi[a.u]>k) continue;
if(vi[t]==k) return a.len;
for(int v=head[a.u];v!=-;v=edge[v].next)
{
p.u=edge[v].v;
p.len=a.len+edge[v].val;
q.push(p);
}
}
return -;
}
int main()
{
int i,j,s,t,k,a,b,c;
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
for(i=;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
scanf("%d%d%d",&s,&t,&k);
dijkstra(t);
if(s==t)
k++;
if(dis[s]==inf)
{
printf("-1\n");
continue;
}
printf("%d\n",A_star(s,t,k));
}
return ;
}
poj 2449 第k短路径的更多相关文章
- A* 算法求第k短路径
A*算法是一类贪心算法,其可以用于寻找最优路径.我们可以利用A*算法来求第k短路径. 一条路径可以由两部分组成,第一部分是一个从出发到达任意点的任意路径,而第二部分是从第一部分的末端出发,到终点的最短 ...
- POJ 2449 Remmarguts' Date (第k短路径)
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions:35025 Accepted: 9467 ...
- poj 2449 第k短路
题目链接:http://poj.org/problem?id=2449 #include<cstdio> #include<cstring> #include<iostr ...
- POJ 3255 Roadblocks --次短路径
由于次短路一定存在,则可知次短路一定是最短路中某一条边不走,然后回到最短路,而且只是一条边,两条边以上不走的话,就一定不会是次短路了(即以边换边才能使最小).所以可以枚举每一条边,算出从起点到这条边起 ...
- [BFS,A*,k短路径] 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 path (Problem - 6705)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=6705 path Time Limit: 2000/2000 MS (Java/Others) Mem ...
- POJ 2449 第k短路 Dijkstra+A*
这道题我拖了半年,,,终于写出来了 思路: 先反向建边 从终点做一次最短路 ->这是估价函数h(x) 再正常建边,从起点搜一遍 (priority_queue(h(x)+g(x))) g(x)是 ...
- POJ 2449 - Remmarguts' Date - [第k短路模板题][优先队列BFS]
题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...
- poj 2449 k短路+A*算法
http://poj.org/problem?id=2449 K短路的定义: 1.如果起点终点相同,那么0并不是最短路,而是要出去一圈回来之后才是最短路,那么第K短路也是一样. 2.每个顶点和每条边都 ...
- POJ 2449 Remmarguts' Date --K短路
题意就是要求第K短的路的长度(S->T). 对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...
随机推荐
- vector 的resize与reserve
最近遇到一个坑,简单说来是resize与reserve的功能混淆了. 如下: 如果调用resize的化,编译会出错,如果给Text提供默认构造函数,则可以编译通过,最终输出的结果为10. 如果调用re ...
- 【C语言】-循环的嵌套
循环的嵌套:当在一个循环语句中嵌入另一个循环时,成为循环的嵌套. 循环嵌套的形式: (1)for语句中嵌入for语句: for ( ) { for ( ) { ... } } (2)for语句嵌入wh ...
- <a href="javascript:void(0);" id='test' onclick="javascript:alert('即将上线,敬请期待!');"><em class="rmwd"></em>征稿平台</a>
<a href="javascript:void(0);" id='test' onclick="javascript:alert('即将上线,敬请期待!');&q ...
- Spring Data JPA教程, 第五部分: Querydsl(未翻译)
The fourth part of my Spring Data JPA tutorialdescribed how you can implement more advanced queries ...
- Listview上下滚动崩溃
利用CursorAdapter在ListView中显示Cursor中不同同类型的item,加载均正常,滚动时报如下错误: 11-28 15:18:16.703: E/InputEventReceive ...
- C#学习笔记(十五):预处理指令
C#和C/C++一样,也支持预处理指令,下面我们来看看C#中的预处理指令. #region 代码折叠功能,配合#endregion使用,如下: 点击后如下: 条件预处理 条件预处理可以根据给出的条件决 ...
- C语言简单实现sizeof功能代码
sizeof不是函数,而是运算符,C/C++语言编译器在预编译阶段的时候就已经处理完了sizeof的问题,也就是说sizeof类似于宏定义. 下面给出一个sizeof的一个宏定义实现版本 #defin ...
- java对cookie的操作_01
/** * 读取所有cookie * 注意二.从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交.浏览器提交Cookie时只会提交name与value属性.maxAg ...
- python的一些总结1
1.安装环境 window用户下载 python :https://www.python.org/downloads/release/python-2710/ 安装不解释.. 配置环境变量 找到 P ...
- 解决Android上的QPython不能import urllib的问题
试用了一下QPython,感觉很强大,Kivy也包含进去了,下载一些第三方库也很方便,相对于SL4A来说确实先进了很多. 但是很快发现不能import urllib,提示大概是这样的内容: No mo ...