bzoj1073[SCOI2007]kshort
1073: [SCOI2007]kshort
Time Limit: 20 Sec Memory Limit: 162 MB
Submit: 1483 Solved: 373
[Submit][Status][Discuss]
Description
有n个城市和m条单向道路,城市编号为1~n。每条道路连接两个不同的城市,且任意两条道路要么起点不同要
么终点不同,因此n和m满足m<=n(n-1)。给定两个城市a和b,可以给a到b的所有简单路(所有城市最多经过一次,
包括起点和终点)排序:先按长度从小到大排序,长度相同时按照字典序从小到大排序。你的任务是求出a到b的第
k短路。
Input
输入第一行包含五个正整数n, m, k, a, b。以下m行每行三个整数u, v, l,表示从城市u到城市v有一条长度
为l的单向道路。100%的数据满足:2<=n<=50, 1<=k<=200
Output
如果a到b的简单路不足k条,输出No,否则输出第k短路:从城市a开始依次输出每个到达的城市,直到城市b,
中间用减号"-"分割。
Sample Input
5 20 10 1 5
1 2 1
1 3 2
1 4 1
1 5 3
2 1 1
2 3 1
2 4 2
2 5 2
3 1 1
3 2 2
3 4 1
3 5 1
4 1 1
4 2 1
4 3 1
4 5 2
5 1 1
5 2 1
5 3 1
5 4 1
【样例输入2】
4 6 1 1 4
2 4 2
1 3 2
1 2 1
1 4 3
2 3 1
3 4 1
【样例输入3】
3 3 5 1 3
1 2 1
2 3 1
1 3 1
Sample Output
1-2-4-3-5
【样例输出2】
1-2-3-4
【样例输出3】
No
HINT
第一个例子有5个城市,所有可能出现的道路均存在。从城市1到城市5一共有5条简单路
.png)
调了很久,发现竟然是spfa手动队列数组开小了,,,
A*算法求K短路吧,状压判重
听说过不了,要加特判
听说有更强的YEN算法,懒得学。
#include<bits/stdc++.h>
#define ll long long
#define N 55
using namespace std;
int n,m,K,s,t,cnt,tot,ent,qe[N*],d[N],hd[N],HD[N],vis[N];
struct edge{int v,w,next;}e[N*N],E[N*N];
struct pth{
int pre,dis,ls;ll vis;vector<int>c;
pth(){dis=pre=;vis=;c.clear();}
bool operator < (const pth &b)const{
if(dis!=b.dis)return dis>b.dis;
int len=min(c.size(),b.c.size());
for(int i=;i<len;i++)
if(c[i]!=b.c[i])return c[i]>b.c[i];
return c.size()>b.c.size();
}
};
void adde(int u,int v,int w){
e[++tot].v=v;
e[tot].w=w;
e[tot].next=hd[u];
hd[u]=tot;
}
void ADDE(int u,int v,int w){
E[++ent].v=v;
E[ent].w=w;
E[ent].next=HD[u];
HD[u]=ent;
}
void spfa(){
memset(d,0x3f,sizeof(d));
int l=,r=;qe[++r]=t;d[t]=;
while(l<=r){
int u=qe[l++];vis[u]=;
for(int i=HD[u];i;i=E[i].next){
int v=E[i].v;
if(d[v]>d[u]+E[i].w){
d[v]=d[u]+E[i].w;
if(vis[v])continue;
vis[v]=;qe[++r]=v;
}
}
}
}
priority_queue<pth>q;
void Astar(){
pth tmp;tmp.vis|=1ll<<(s-);
tmp.c.push_back(s);tmp.ls=s;
q.push(tmp);
while(!q.empty()){
if (q.size()>)break;
pth u=q.top();q.pop();
if(u.ls==t)cnt++;
if(cnt==K){
for(int i=;i<u.c.size();i++){
int x=u.c[i];printf("%d",x);
if(x!=t)putchar('-');
else putchar('\n');
}
break;
}
if(u.ls==t)continue;
for(int i=hd[u.ls];i;i=e[i].next){
int v=e[i].v;
if(u.vis&(1ll<<(v-)))continue;
tmp=u;tmp.ls=v;tmp.pre+=e[i].w;
tmp.dis=tmp.pre+d[v];tmp.vis|=1ll<<(v-);
tmp.c.push_back(v);q.push(tmp);
}
}
}
int main(){
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=;i<=m;i++){
static int u,v,w;
scanf("%d%d%d",&u,&v,&w);
adde(u,v,w);ADDE(v,u,w);
}
spfa();Astar();
if(cnt<K)puts("No");
return ;
}
bzoj1073[SCOI2007]kshort的更多相关文章
- BZOJ1073 [SCOI2007]kshort K短路,A*
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1073 题意概括 以距离为第一关键字,字典序为第二关键字,在所有的从S到T的路径中,选择不重复经过某 ...
- BZOJ 1073: [SCOI2007]kshort
二次联通门 : BZOJ 1073: [SCOI2007]kshort /* BZOJ 1073: [SCOI2007]kshort A* k短路 但是会爆一个点, 是卡A*的 */ #include ...
- COGS 2342. [SCOI2007]kshort
★★☆ 输入文件:bzoj_1073.in 输出文件:bzoj_1073.out 简单对比时间限制:2 s 内存限制:512 MB [题目描述] 有n个城市和m条单向道路,城市编号为1 ...
- COGS——T 2342. [SCOI2007]kshort || BZOJ——T 1073
http://www.cogs.pro/cogs/problem/problem.php?pid=2342 ★★☆ 输入文件:bzoj_1073.in 输出文件:bzoj_1073.out ...
- NOIP模拟2
期望得分:100+100+100=300 实际得分:70+40+20=130 T1 [SCOI2007]kshort弱化版 Description 有n个城市和m条单向道路,城市编号为1~n.每条道路 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 1066: [SCOI2007]蜥蜴
1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3545 Solved: 1771[Submit][Status] ...
- BZOJ 1070: [SCOI2007]修车 [最小费用最大流]
1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 4936 Solved: 2032[Submit][Status] ...
- BZOJ1068: [SCOI2007]压缩
... 1068: [SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 909 Solved: 566[Submit][Statu ...
随机推荐
- DML数据操作语言之常用函数
所谓函数,就是输入某一值,得到相应的输出结果的功能.相当于一个加工厂,给了原料,最终产出成品. 其中原料 就是参数(parameter). 产品 就是返回值. 函数大致可以分为以下五个种类: 算术函数 ...
- GPUImage滤镜效果翻译
#import"GPUImageBrightnessFilter.h"//亮度 #import"GPUImageExposureFilter.h"//曝光 #i ...
- [ZLXOI2015]殉国
2057. [ZLXOI2015]殉国 http://cogs.pro/cogs/problem/problem.php?pid=2057 ★☆ 输入文件:BlackHawk.in 输出文件: ...
- Node入门教程(2)第一章:NodeJS 概述
Node 概述 什么是 Node Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...
- 策略模式(Stratety)
namespace StrategyPattern //策略模式 { /// <summary> /// 定义所以支持的算法的公共接口 /// </summary> abstr ...
- vue-cli webpack3扩展多模块打包
场景 在实际的项目开发中会出现这样的场景,项目中需要多个模块(单页或者多页应用)配合使用的情况,而vue-cli默认只提供了单入口打包,所以就想到对vue-cli进行扩展 实现 首先得知道webpac ...
- 从一个事件绑定说起 - DOM
事件绑定的方式 给 DOM 元素绑定事件分为两大类:在 html 中直接绑定 和 在 JavaScript 中绑定. Bind in HTML 在 HTML 中绑定事件叫做内联绑定事件,HTML 的元 ...
- jmeter入门(02)测试报告各项指标含义
一.名词定义(时间单位ms) 1.聚合报告 Sample:本次测试场景共运行多少个请求: Average:平均响应时间: Median:统计意义上的响应时间中值: 90% line:所有线程中90%的 ...
- python入门(5)使用文件编辑器编写代码并保存执行
python入门(5)使用文件编辑器编写代码并保存执行 两款文本编辑器: 一个是Sublime Text,免费使用,但是不付费会弹出提示框: 一个是Notepad++,免费使用,有中文界面: 请注意, ...
- cookie的实现原理
cookie技术通过在请求和响应报文中写入cookie信息来控制客户点的状态 cookie会根据从服务器端发送的响应报文内的一个叫做set-cookie的首部字段信息,通知客户端保存cookie 当下 ...