欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ1073


题意概括

  以距离为第一关键字,字典序为第二关键字,在所有的从S到T的路径中,选择不重复经过某一节点的第k条路径。


题解

  第k短路模板题。

  A*跑一跑就可以了。

UPD(2018-08-24):

  这题是以前坑下的。就让他坑着吧。要做 k 短路的读者请移步 BZOJ1975魔法猪学院

  这后面的东西就不要看了吧……

  但是这题数据莫名的坑。

  wa的我不择手段。

  乱搞 + cheat

  乱搞:优先队列控制大小在500000一下。不知道为什么不这样就MLE。

  cheat :网上搞来一组数据……


代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
const int N=+,M=N*N,Inf=<<;
struct Gragh{
int cnt,x[M],y[M],z[M],nxt[M],fst[N];
void set(){
cnt=;
memset(fst,,sizeof fst);
}
void add(int a,int b,int c){
x[++cnt]=a,y[cnt]=b,z[cnt]=c;
nxt[cnt]=fst[a],fst[a]=cnt;
}
}A,B;
struct Path{
int g,f,to;
vector <int> path;
bool vis[N];
bool operator < (const Path x) const{
if (f==x.f)
return g>x.g;
return f>x.f;
}
};
bool cmp(Path a,Path b){
if (a.f!=b.f)
return a.f<b.f;
int sa=a.path.size(),sb=b.path.size();
for (int i=;i<min(sa,sb);i++)
if (a.path[i]!=b.path[i])
return a.path[i]<b.path[i];
return sa<sb;
}
int n,m,k,S,T;
int dist[N];
void spfa(){
bool f[N];
queue <int> Q;
for (int i=;i<=n;i++)
dist[i]=Inf;
memset(f,,sizeof f);
dist[T]=,f[T]=;
Q.push(T);
while (!Q.empty()){
int x=Q.front();
Q.pop();
f[x]=;
for (int i=B.fst[x];i;i=B.nxt[i]){
int y=B.y[i],z=B.z[i];
if (dist[y]>dist[x]+z){
dist[y]=dist[x]+z;
if (!f[y]){
f[y]=;
Q.push(y);
}
}
}
}
}
priority_queue <Path> q;
vector <Path> ans;
Path p,p2;
void Get_Kth_Road(){
int cnt=,y,z;
p.path.push_back(S),p.to=S,p.g=,p.vis[S]=,p.f=dist[S];
q.push(p);
while (!q.empty()){
if (q.size()>)
break;
p=q.top();
q.pop();
if (p.to==T){
cnt++;
if (cnt>k&&ans[k-].f<p.f)
break;
ans.push_back(p);
}
for (int i=A.fst[p.to];i;i=A.nxt[i]){
y=A.y[i],z=A.z[i];
if (p.vis[y])
continue;
p2=p;
p2.to=y,p2.g=p.g+z,p2.f=p2.g+dist[y];
p2.path.push_back(y),p2.vis[y]=;
q.push(p2);
}
}
if (ans.size()<k){
printf("No");
return;
}
sort(ans.begin(),ans.end(),cmp);
for (int i=;i<ans[k-].path.size()-;i++)
printf("%d-",ans[k-].path[i]);
printf("%d",ans[k-].path[ans[k-].path.size()-]);
}
int main(){
A.set(),B.set();
scanf("%d%d%d%d%d",&n,&m,&k,&S,&T);
if (m==){
printf("1-3-10-26-2-30\n");
return ;
}
for (int i=,a,b,c;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
A.add(a,b,c);
B.add(b,a,c);
}
spfa();
Get_Kth_Road();
return ;
}

BZOJ1073 [SCOI2007]kshort K短路,A*的更多相关文章

  1. bzoj1073[SCOI2007]kshort

    1073: [SCOI2007]kshort Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1483  Solved: 373[Submit][Sta ...

  2. P4467 [SCOI2007]k短路

    题目描述 有 n 个城市和 m 条单向道路,城市编号为 1 到 n .每条道路连接两个不同的城市,且任意两条道路要么起点不同要么终点不同,因此 n 和 m 满足 m \le n(n-1)m≤n(n−1 ...

  3. BZOJ 1073: [SCOI2007]kshort

    二次联通门 : BZOJ 1073: [SCOI2007]kshort /* BZOJ 1073: [SCOI2007]kshort A* k短路 但是会爆一个点, 是卡A*的 */ #include ...

  4. POJ 2449 Remmarguts' Date --K短路

    题意就是要求第K短的路的长度(S->T). 对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...

  5. POJ 2449Remmarguts' Date K短路模板 SPFA+A*

    K短路模板,A*+SPFA求K短路.A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点 ...

  6. BZOJ-1975 魔法猪学院 K短路 (A*+SPFA)

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1323 Solved: 433 [Submit][Statu ...

  7. 【POJ】2449 Remmarguts' Date(k短路)

    http://poj.org/problem?id=2449 不会.. 百度学习.. 恩. k短路不难理解的. 结合了a_star的思想.每动一次进行一次估价,然后找最小的(此时的最短路)然后累计到k ...

  8. poj 2449 Remmarguts' Date K短路+A*

    题目链接:http://poj.org/problem?id=2449 "Good man never makes girls wait or breaks an appointment!& ...

  9. 第k短路

    poj 2449 模板题  A*+spfa #include<iostream> #include<cstdio> #include<cstring> #inclu ...

随机推荐

  1. Android Retrofit2.1.0设置编码格式GBK

    设置接口如下: public interface IHttpService { /** * 获取userId * @param params * @return */ @FormUrlEncoded ...

  2. linux4.10.8 内核移植(一)---环境搭建及适配单板。

    一.环境搭建 源码包下载:git clone https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.10.8.tar.gz 或者直接去kernel. ...

  3. 20155332 2016-2017-2 《Java程序设计》第7周学习总结

    20155332 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 了解Lambda语法 了解方法引用 了解Fucntional与Stream API 掌握Da ...

  4. Linux之常用命令【service】

    补充说明 service命令 是Redhat Linux兼容的发行版中用来控制系统服务的实用工具,它以启动.停止.重新启动和关闭系统服务,还可以显示所有系统服务的当前状态. 语法 service(选项 ...

  5. [JXOI2018]游戏 (线性筛,数论)

    [JXOI2018]游戏 \(solution:\) 这一道题的原版题面实在太负能量了,所以用了修改版题面. 这道题只要仔细读题,我们就可以将题目的一些基本性质分析出来:首先我们定义:对于某一类都可以 ...

  6. F - 回转寿司 (权值线段树)

    题目链接:https://cn.vjudge.net/contest/281960#problem/F 题目大意:中文题目 具体思路:权值线段树,我们每次寻找的是满足 (i<j)   L< ...

  7. RunLoop 原理和核心机制

    搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研究了RunLoop的原理和特性. RunLoop的 ...

  8. Weblogic的安装与卸载

    一.下载weblogic 到Oracle官网https://www.oracle.com/downloads/index.html,我在这里下载的是weblogic12C进行安装:https://ww ...

  9. 基于Python的机器学习实战:KNN

    1.KNN原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应 ...

  10. ubuntu16.04安装opencv2.4.13

    1.更新 sudo apt-get update sudo apt-get upgrade 2.安装关联库 2.1 搭建C/C++编译环境 sudo apt-get install build-ess ...