传送门:

http://www.qscoj.cn/#/problem/show/1987

童心未泯的帆宝和乐爷 Edit

Time Limit: 10000 MS     Memory Limit: 256 MB
Submit Status

6·1即将来临,游乐园推出了新的主题活动,雨过天晴,帆宝乐爷童心未泯,准备一探究竟。

兴奋的他们一入园便和孩子们打成一片,不知不觉便走散了。

当他们意识到的时候,只能通过手机来确认对方的位置。

他们当然想尽快找到对方,然而由于孩子们实在是太多,只能选择距离稍远的但是游客稀少的路会合。

帆宝希望找到第kk 短的路径,这条路径是他认为的幸运路径。

帆宝迫切地想知道该条路径的长度,而乐于助人的你也一定会帮助她的。

Input

第一行三个整数n,m,kn,m,k ,分别表示游乐园的景点数目、景点之间的道路数目以及路径长度从小到大排列时希望选择的序号。

第二行两个整数S,TS,T ,分别表示帆宝乐爷所在景点的编号。

接下来mm 行,每行三个整数u,v,wu,v,w ,表示编号为uu 和vv 的景点之间有一条长度为ww 的单向通路。

1≤n≤1000,0≤m≤100000,1≤k≤1000,1≤S,T,u,v≤N,1≤w≤1001≤n≤1000,0≤m≤100000,1≤k≤1000,1≤S,T,u,v≤N,1≤w≤100

Output

第一行一个整数xx ,表示所选路径的长度

无解输出−1−1

Sample input and output

Sample Input Sample Output
3 3 2
1 2
1 2 2
1 3 4
3 2 1
5

Hint

Source

2018 UESTC ACM Training for Search Algorithm and String
 
分析:
第k短路,A*+spfa解决
属于模板题
但是我A*+优化的迪杰斯特拉超时 。。。
mmp
还拿着在poj交了一道题,可以过啊
应该是测试数据不适合迪杰斯特拉吧
。。。。。。。。。。(自我安慰)
 
code:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int AX = 1e5+;
const int MAXN = 1e3+;
int n,m,k;
int s,t;
int tot;
int retot;
struct edge
{
int to,w;
int next1;
} G[AX],RG[AX]; struct Node
{
int v;
int f,h,g;
bool operator < (const Node &a) const
{
return f==a.f? g>a.g : f>a.f;
}
}; int dis[MAXN];
int head[MAXN];
int rehead[AX];
int vis[MAXN]; void add_edge(int u,int v,int c)
{
G[tot].to=v;
G[tot].w=c;
G[tot].next1=head[u];
head[u]=tot++; RG[retot].to=u;
RG[retot].w=c;
RG[retot].next1=rehead[v];
rehead[v]=retot++;
}
void SPFA()
{
for(int i=; i<=n; i++) dis[i]=INF;
dis[t]=;
queue<int> Q;
Q.push(t);
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int i=rehead[u]; i!=-; i=RG[i].next1)
{
int v=RG[i].to ;
int w=RG[i].w ;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
Q.push(v);
}
}
}
} int Astar(Node a)//A*算法
{
memset(vis,,sizeof(vis));
if(dis[s]==INF) return -;//如果没有与S相连的点
if(s==t) k++;
priority_queue<Node> Q;
Q.push(a);
while(!Q.empty())
{
Node tmp=Q.top();
Q.pop();
int v=tmp.v;
vis[v]++;
if(vis[t]==k) return tmp.g;
for(int i=head[v]; i!=-; i=G[i].next1)
{
Node p;
p.v=G[i].to;
p.h=dis[G[i].to];
p.g=tmp.g+G[i].w;
p.f=p.g+p.h;
Q.push(p);
}
}
return -;
} int main()
{
tot=;
retot=;
memset(head,-,sizeof head);
memset(rehead,-,sizeof rehead);
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d",&s,&t);
int x,y,w;
for(int i=; i<m; i++)
{
scanf("%d%d%d",&x,&y,&w);
add_edge(x,y,w);
}
SPFA();
Node a;
a.v=s;
a.g=;
a.h=dis[s];
a.f=a.g+a.h;
int g=Astar(a);
printf("%d\n",g);
return ;
}

也贴一下超时的A*+优化的迪杰斯特拉

#include <iostream>
#include <cstdio>
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<memory>
#include<queue>
#include<vector>
using namespace std;
typedef long long LL;
#define max_v 10010
#define INF 99999999
struct node
{
int to,val;
node(){}
node(int a,int b)
{
to=a;
val=b;
}
};
vector<node> e[max_v],ee[max_v];
int n,m,k;
int vis[max_v];
int dis[max_v];
void addEdge(int x,int y,int val)
{
e[x].push_back(node(y,val));
ee[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=;i<=n;i++)
vis[i]=,dis[i]=INF; vis[t]=,dis[t]=,q.push(t); int u,len;
while(!q.empty())
{
u=q.top();
q.pop(); len=ee[u].size();
for(int i=;i<len;i++)
{
node v=ee[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]=;
}
}
}
vis[u]=;
}
}
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(,dis[s],s)); int len,num;
num=;
while(!Q.empty())
{
Anode u=Q.top();
Q.pop(); if(u.id==t)
++num;
if(num>=k)
return u.h; len=e[u.id].size();
for(int i=;i<len;i++)
{
node v=e[u.id][i];
Q.push(Anode(u.h+v.val,dis[v.to],v.to));
}
}
return -;//不能连通或者没有k短路
}
int main()
{
int x,y,v,s,t;
while(~scanf("%d %d %d",&n,&m,&k))
{
scanf("%d %d",&s,&t);
for(int i=;i<max_v;i++) e[i].clear(),ee[i].clear();
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&v);
addEdge(x,y,v);
}
if(s==t) k++;
Dijkstra(s,t);
printf("%d\n",Astar(s,t));
}
return ;
}
//有向图 第k短路模板

UESTC - 1987 童心未泯的帆宝和乐爷 (第k短路 A*算法+SPFA算法 模板)的更多相关文章

  1. UESTC 30.最短路-最短路(Floyd or Spfa(链式前向星存图))

    最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...

  2. cdoj1092-韩爷的梦 (字符串hash)【hash】

    http://acm.uestc.edu.cn/#/problem/show/1092 韩爷的梦 Time Limit: 200/100MS (Java/Others)     Memory Limi ...

  3. 淘宝SKU组合查询算法实现

    淘宝SKU组合查询算法实现 2015-11-14 16:18 1140人阅读 评论(0) 收藏 举报  分类: JavaScript(14)    目录(?)[+]   前端有多少事情可以做,能做到多 ...

  4. 巧用ecshop做淘宝客

    一.第一步 下载文件,可以在http://www.ecshop.com/下载ecshop各个版本的安装包,安装好ECSHOP,然后通过PTF工具下载2个文件到本地进行修改.这个2个文件分别是goods ...

  5. python就业班-淘宝-目录.txt

    卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python就业班-淘宝-目录.txt│ ├─01 网络编程│ ├─01-基本概念│ │ 01-网络通信概述 ...

  6. Python3爬虫爬取淘宝商品数据

    这次的主要的目的是从淘宝的搜索页面获取商品的信息.其实分析页面找到信息很容易,页面信息的存放都是以静态的方式直接嵌套的页面上的,很容易找到.主要困难是将信息从HTML源码中剥离出来,数据和网页源码结合 ...

  7. A*算法在最短路问题的应用及其使用举例

    1 A*算法 A*算法在人工智能中是一种典型的启发式搜索算法,启发中的估价是用估价函数表示的: 其中f(n)是节点n的估价函数,g(n)表示实际状态空间中从初始节点到n节点的实际代价,h(n)是从n到 ...

  8. [Erlang 0105] Erlang Resources 小站 2013年1月~6月资讯合集

    很多事情要做,一件一件来; Erlang Resources 小站 2013年1月~6月资讯合集,方便检索.      小站地址: http://site.douban.com/204209/     ...

  9. CodeIgniter(CI)框架中的验证码

    在CodeIgniter框架中,CI本身自带了验证码,但是查看文档的时候,发现: 需要新建一个表,用来存储验证码信息.因为习惯了session存储验证码信息,所以我把我认为比较好看的验证码应用在了CI ...

随机推荐

  1. eclipse 更改背景颜色字体

    原文 切一个自己的图: 废话不说,直接入题. 方式一:替换Eclipse的配置文件 其实Eclipse的各种配置都是在文件设置里的,因此只要用一个配置好的模版来替换默认的配置文件,即可将所有配置克隆到 ...

  2. HTTP协议的内容协商

    一.前言 我们在日常的抓包过程中经常可以看到以Accept开头的请求首部,比如:Accept-Language 有一个q值,肯定有人好奇在HTTP规范中为什么要定义这个q值:还有在响应首部有一个名为V ...

  3. Luogu4433:[COCI2009-2010#1] ALADIN(类欧几里德算法)

    先套用一个线段树维护离散化之后的区间的每一段的答案 那么只要考虑怎么下面的东西即可 \[\sum_{i=1}^{n}(A\times i \ mod \ B)\] 拆开就是 \[\sum_{i=1}^ ...

  4. react父子组件各自生命周期函数加载的先后顺序

    理解记忆总结: 父组件即将挂载(最外层的父组件都还没准备进入,其内部的子组件当然更没进入了) -> 子组件即将挂载  -> 子组件挂载完成(父内部都没完成,父当然不能算完成)  -> ...

  5. jQuery的attr()与prop()的区别

    jQuery的attr()与prop()都是用于获取与设置属性的,但它们又各有不同. attr()一般是用于设置默认值,prop()一般是用于设置属性值,即对于像“diabled”,"che ...

  6. 【源代码R3】移植一份LARGE_INTEGER转时间的代码

    本代码来自ReactOS-0.4.0\lib\rtl\time.c中的函数RtlTimeToTimeFields(IN PLARGE_INTEGER Time, OUT PTIME_FIELDS Ti ...

  7. 新手嘛,先学习下 Vue2.0 新手入门 — 从环境搭建到发布

    Vue2.0 新手入门 — 从环境搭建到发布 转自:http://www.runoob.com/w3cnote/vue2-start-coding.html 具体文章详细就不搬了,步骤可过去看,我这就 ...

  8. Array inversion case

    package basic.java; import java.util.Scanner; /* * 需求: * (1)键盘录入5个int类型的数据存储数组arr中 * (2)定义方法将arr数组中的 ...

  9. ubuntu16 下安装redis 以及设置其为开机启动

    1.下载redis安装包 sudo wget http://download.redis.io/releases/redis-3.2.6.tar.gz 2.解压 tar -zxvf  redis-3. ...

  10. Java Web开发中的转发和重定向的问题

    Java Web的页面实现跳转有两种方式,一种是转发,另外一种是重定向.一般来说,转发比重定向快.重定向会经过客户端,转发却不会. 转发 request.getRequestDispatcher(&q ...