bzoj1073
题意:
k短路
题解:
A*
当然是抄了zzd的代码
然而需要特判
为什么把bool改成int爆空间!!!
代码:
#include<bits/stdc++.h>
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,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的更多相关文章
- BZOJ1073 [SCOI2007]kshort K短路,A*
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1073 题意概括 以距离为第一关键字,字典序为第二关键字,在所有的从S到T的路径中,选择不重复经过某 ...
- bzoj1073[SCOI2007]kshort
1073: [SCOI2007]kshort Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1483 Solved: 373[Submit][Sta ...
- BZOJ1073 k短路(A*算法)
A*算法,也叫启发式搜索,就是设计一个预估函数,然后在搜索的过程中进行有序的搜索,我们设到目前状态的花费为f(x),到目标状态的估计花费为h(x),那么我们按照h(x)+f(x)排序即可,这道题里起点 ...
- 5.15[没什么营养的一段日子]A*
五月份没有写过blog. 期中考刚过......漫漫文化课,无尽头. 马上要为联赛开坑了,激动啊. 刚听了孙柘的演讲..%%% 最近刷的题只有一道启发式合并,一道分层图,一道差分约束..然后不知不觉破 ...
- BZOJ第1页养成计划
嗯,用这篇博客当一个目录,方便自己和学弟(妹?)们查阅.不定期更新. BZOJ1000 BZOJ1001 BZOJ1002 BZOJ1003 BZOJ1004 BZOJ1005 ...
随机推荐
- Python开发【模块】:内置模块
内置模块 1.__import__ # import app目录下的kingadmin.py文件 for app in conf.settings.INSTALLED_APPS: __import__ ...
- django的request对象和response对象
概述Django 使用 request 和 response 对象表示系统状态数据..当请求一个页面时,Django创建一个 HttpRequest 对象.该对象包含 request 的元数据. 然后 ...
- mybatis 中jdbctype和javatype的对应关系
1:mybatis 中jdbctype和javatype的对应关系 JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String ...
- OpenResty--mysql,redis 项目中的应用
最近刚刚接手同事的OpenResty的项目,发现对mysql,redis的操作没有用连接池,故对此进行了改造. MYSQL 主要是通过mysql_pool.lua 和 dbutil.lua 来封装对数 ...
- 安装完C++builder6.0启动的时候总是出现无法将'C:\Program Files\Borland\CBuilder6\Bin\bcb.$$$'重命名为bcb.dro
:兼容性问题 运行前右键属性“兼容性”-尝试不同的兼容性.比如“windows 8”
- SQL语句中case函数
case函数,严格的意义上来讲case函数已经试流程控制语句了,不是简单意义上的函数,不过为了方便,很多人将case函数称为流程控制函数. case函数的一般有两种用法:1.case expressi ...
- 一篇关于Redis的很不错的文章,转载保存下
绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知.这里对 Redis 常见问题做一个总结,解决 ...
- Python基础笔记之同时装了Python3和Python2,怎么在命令行使用pip
我们在安装Python3(>=3.3)时,Python的安装包实际上在系统中安装了一个启动器py.exe,默认放置在文件夹C:\Windows\下面.这个启动器允许我们指定使用Python2还是 ...
- 一次频繁Full GC问题排查过程分享
问题描述 应用收到频繁Full GC告警 问题排查 登录到对应机器上去,查看GC日志,发现YGC一分钟已经达到了15次,比Full GC还要频繁一些,其中Full GC平均10分钟超过了4次,如下图 ...
- P1052 过河(离散化+dp)
P1052 过河 dp不难,重点是要想到离散化. 石子个数$<=100$意味着有大量空间空置,我们可以缩掉这些空间. 实现的话自己yy下就差不多了. #include<iostream&g ...