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短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...
随机推荐
- Windows下cmd的替代软件——PowerCmd
Powercmd 是一款运行在windows下的cmd增强软件(A Better Command Prompt Replacement Tool),当前最新的版本为2.2. 官方提供试用版,貌似没有功 ...
- 【转】并发编程之Operation Queue
http://blog.xcodev.com/blog/2013/10/28/operation-queue-intro/ 随着移动设备的更新换代,移动设备的性能也不断提高,现在流行的CPU已经进入双 ...
- 在Delphi7中JSON遍历节点不支持使用IN处理方法
相关资料:http://www.cnblogs.com/del/archive/2009/10/23/1588690.html Delphi2007源代码: procedure TForm1.Butt ...
- jQuery基础学习2——DOM和jQuery对象
<body> <h3>例子</h3> <p title="选择你最喜欢的水果." >你最喜欢的水果是?</p> < ...
- js获取服务端IP及端口及协议
alert("location:"+window.location); alert("href: "+window.location.href); alert( ...
- Serializable 序列化为文件
package test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...
- Spring Data JPA教程, 第二部分: CRUD(翻译)
我的Spring Data Jpa教程的第一部分描述了,如何配置Spring Data JPA,本博文进一步描述怎样使用Spring Data JPA创建一个简单的CRUD应用.该应用要求如下: pe ...
- 利用WPF创建含多种交互特性的无边框窗体
咳咳,标题一口气读下来确实有点累,让我先解释一下.另外文章底部有演示程序的下载. 本文介绍利用WPF创建一个含有以下特性的窗口: 有窗口阴影,比如QQ窗口外围只有几像素的阴影: 支持透明且无边框,为了 ...
- 集合引入(ArrayList、LinkedList)
1.引入 代替数组固定大小操作不变 2.ArrayList 常用的操作(add,remove) 3.LinkedList 能实现一些特殊的操作(pop)
- [转]sql server 数据库日期格式化函数
转至:http://www.cnblogs.com/hantianwei/archive/2009/12/03/1616148.html 0 或 100 (*) 默认值 mon ...