UESTC - 1987 童心未泯的帆宝和乐爷 (第k短路 A*算法+SPFA算法 模板)
传送门:
http://www.qscoj.cn/#/problem/show/1987
童心未泯的帆宝和乐爷 Edit
Time Limit: 10000 MS Memory Limit: 256 MB
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 |
---|---|
|
|
Hint
Source
- #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算法 模板)的更多相关文章
- UESTC 30.最短路-最短路(Floyd or Spfa(链式前向星存图))
最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同 ...
- cdoj1092-韩爷的梦 (字符串hash)【hash】
http://acm.uestc.edu.cn/#/problem/show/1092 韩爷的梦 Time Limit: 200/100MS (Java/Others) Memory Limi ...
- 淘宝SKU组合查询算法实现
淘宝SKU组合查询算法实现 2015-11-14 16:18 1140人阅读 评论(0) 收藏 举报 分类: JavaScript(14) 目录(?)[+] 前端有多少事情可以做,能做到多 ...
- 巧用ecshop做淘宝客
一.第一步 下载文件,可以在http://www.ecshop.com/下载ecshop各个版本的安装包,安装好ECSHOP,然后通过PTF工具下载2个文件到本地进行修改.这个2个文件分别是goods ...
- python就业班-淘宝-目录.txt
卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python就业班-淘宝-目录.txt│ ├─01 网络编程│ ├─01-基本概念│ │ 01-网络通信概述 ...
- Python3爬虫爬取淘宝商品数据
这次的主要的目的是从淘宝的搜索页面获取商品的信息.其实分析页面找到信息很容易,页面信息的存放都是以静态的方式直接嵌套的页面上的,很容易找到.主要困难是将信息从HTML源码中剥离出来,数据和网页源码结合 ...
- A*算法在最短路问题的应用及其使用举例
1 A*算法 A*算法在人工智能中是一种典型的启发式搜索算法,启发中的估价是用估价函数表示的: 其中f(n)是节点n的估价函数,g(n)表示实际状态空间中从初始节点到n节点的实际代价,h(n)是从n到 ...
- [Erlang 0105] Erlang Resources 小站 2013年1月~6月资讯合集
很多事情要做,一件一件来; Erlang Resources 小站 2013年1月~6月资讯合集,方便检索. 小站地址: http://site.douban.com/204209/ ...
- CodeIgniter(CI)框架中的验证码
在CodeIgniter框架中,CI本身自带了验证码,但是查看文档的时候,发现: 需要新建一个表,用来存储验证码信息.因为习惯了session存储验证码信息,所以我把我认为比较好看的验证码应用在了CI ...
随机推荐
- MySQL的预编译功能
1.预编译的好处 大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能.什么是预编译功能呢?它有什么好处呢? 当客户发送一条SQL语句给服务器后,服务器总是需要校验S ...
- Eclipse设置虚拟机参数 (转 构建内存溢出)
Java -verbose:gc 中参数-verbose:gc 表示输出虚拟机中GC的详细情况. 首先在Eclipse的Debug页签中设置虚拟机参数: 步骤: 1.选中已经写好的项目 2.Run-& ...
- H5实现拍照上传功能
<input type="file" capture="camera" accept="image/*" >
- drupal7 获取网站名称
$site_name=variable_get('site_name', 'Drupal');
- Html5 锚 <a>的页内跳转, name=abc herf=#abc
锚点是网页制作中超级链接的一种,又叫命名锚记.命名锚记像一个迅速定位器一样是一种页面内的超级链接,运用相当普遍. 英文名:anchor 使用命名锚记可以在文档中设置标记,这些标记通常放在文档的特定主题 ...
- .net reflector+reflexil修改编译后的dll文件
1.用reflector打开相关的dll文件. 2.如果reflector中没有reflexil插件,点击工具栏中的Tools->Add-Ins 3.找到需要修改的文件,双击打开该文件:点击To ...
- java中字节流与字符流以及字节流多余字节问题
1.字节流 字节流byte为单位对文件的数据进行写入与读取操作.字节的方式在复制音频图片文件时比较适用,但在对于普通文件的读写上有两大缺陷: 第一,字节流在读取中文字符时,若设定的字节数组长度刚好末尾 ...
- 深入理解C++中的初始化
C++经过这么多年的发展,已然成了一种文化和艺术,而这种艺术和文化并不是C++所固有的,是C++在各个方面的应用的总结和艺术化的结果.C++看起来比较复杂,但是深入其中你会发现C++是那么优美而富有哲 ...
- web前端与后端的理解区分
要了解web前后端的区别,首先必须得清楚什么是web前端和web后端. 首先:web的本意是蜘蛛网和网的意思,在网页设计中我们称为网页的意思.现广泛译作网络.互联网等技术领域.表现为三种形式,即超文本 ...
- ASP.NET中的身份验证有那些?你当前项目采用什么方式验证请解释
ASP.NET身份验证模式包括Windows.Forms(窗体).Passport(护照)和None(无). l Windows身份验证—常结合应用程序自定义身份验证使用使用这种身份验证模式时,AS ...