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短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...
随机推荐
- AutoCAD.NET二次开发:创建自定义菜单的两种方法比较
目前我已经掌握的创建CAD菜单方法有两种: COM方式: http://www.cnblogs.com/bomb12138/p/3607929.html CUI方式: http://www.cnblo ...
- [iOS 多线程 & 网络 - 1.3] - NSOperation
A.NSOperation的基本使用 1.NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperatio ...
- Nginx 禁止IP访问
我们在使用的时候会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了.下面我们就先看看Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了 ...
- Linux性能监测
1.Linux性能监测:监测目的与工具介绍 看了某某教程.读了某某手册,按照要求改改某些设置.系统设定.内核参数就认为做到系统优化的想法很傻很天真:)系统优化是一项复杂.繁琐.长期的工作,优化前需要监 ...
- 终于吧Appserv搞通了
.在学习php的时候遇到了这个问题; 1.Fatal error: Call to undefined function set_magic_quotes_runtime() in E:\App 打开 ...
- 【JDBC】百万数据插入
使用JDBC连接数据库时,如果插入的数据量大,一条一条地插入数据会变得非常缓慢.此时,我们需要用到预处理. 查阅Java开发文档,我们可以看到: 接口 PreparedStatement 表示预编译的 ...
- 前端响应式设计中@media等的相关运用
现在做前端响应式网站特别,响应式成为现在前端设计一个热点,它成为热点的最主要的原因就是,移动端设备屏幕的种类多样,那么如何设置响应式屏幕. /*打印样式*/ @mediaprint{color:red ...
- MX记录查询
nslookup set type=mx
- Visual Studio 调用 Delphi DLL 会退出的解决方案
新写了一个 Delphi 的 dll 供 C# 程序调用,却发现在使用 Visual Studio 2012 进行调试时,程序会在调用后自动退出. 经过对比,只需要将工程属性中“调试”一页下的“启用 ...
- 硝烟中的scrum学习笔记 - 怎样制定Sprint计划(Plan Meeting)
1. 如何估算我们这个sprint能做多少个故事点 1) 本能反应 2) 生产率计算 估算生产率/实际生产率 看看团队的历史,看看他们在过去几个sprint里的生产率是多少 然后假定在下一个sp ...