欢迎访问~原文出处——博客园-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. DotNetBar滚动条的疑似BUG

    1.重现过程,在winform窗体上拖一个VScrollBarAdv 2.Button里点击跟踪代码 3.Value居然是-5,,而不是0,这是直接赋值,不是手动拖的呀. 4.解决办法,将LargeC ...

  2. JS知识整理之 Call&Apply方法

    JavaScript中的函数也是对象,和其他JS对象一样也可以包含方法,其中Call和Apply就是其中比较重要的方法,可以用来间接的调用函数.这两个方法允许显式制定调用所需的this值,也就是说所有 ...

  3. VS2015 与 Git 的简单使用

    前言 在白忙之中抽了点时间,记录了下 VS 与 Git 的简单使用. 在之前使用命令行的时候,提交或拉取代码时,总报错:(提取时遇到错误: Unsupported URL protocol),后来在网 ...

  4. JavaScript之BOM五大对象(window;location;navigator;screen;history)

    一.window 1.浏览器窗口与页面各部分尺寸 2.间歇调用与超时调用 setInterval(function,time(以毫秒计)) 返回:时间Id号(为clearInterval(timeId ...

  5. CSS进阶之模拟Bootstrap网格布局

    目前暂时实现效果,容后面整理心得,先贴上源代码. 源码 <!DOCTYPE html> <html> <head> <title>demo bootst ...

  6. [NOIP2012提高]借教室 题解(二分答案+差分)

    [NOIP2012提高&洛谷P1083]借教室 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室 ...

  7. mysql数据库备份和恢复

    1.数据库备份 mysqldump -uroot -proot jira736 > jira736.sql 2.数据库恢复 mysql -uroot -proot jira762 < ji ...

  8. configure编译选项

    1.rpath与rpath-link的区别 参考链接:http://blog.csdn.net/xph23/article/details/38157491 rpath 是 运行时候链接的库, rpa ...

  9. python - 上下文管理协议(with + __enter__ + __exit__)

    上下文管理协议: with + __enter__ + __exit__ #上下问管理协议: #with + __enter__ + __exit__ class Test(): def __init ...

  10. android handlerThread

    一.handlerThread产生的背景