bzoj1073[SCOI2007]kshort

时间:2022-09-02 22:56:25

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

【样例输入1】
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】
1-2-4-3-5
【样例输出2】
1-2-3-4
【样例输出3】
No

HINT

第一个例子有5个城市,所有可能出现的道路均存在。从城市1到城市5一共有5条简单路

bzoj1073[SCOI2007]kshort

调了很久,发现竟然是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的更多相关文章

  1. BZOJ1073 &lbrack;SCOI2007&rsqb;kshort K短路&comma;A&ast;

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1073 题意概括 以距离为第一关键字,字典序为第二关键字,在所有的从S到T的路径中,选择不重复经过某 ...

  2. BZOJ 1073&colon; &lbrack;SCOI2007&rsqb;kshort

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

  3. COGS 2342&period; &lbrack;SCOI2007&rsqb;kshort

    ★★☆   输入文件:bzoj_1073.in   输出文件:bzoj_1073.out   简单对比时间限制:2 s   内存限制:512 MB [题目描述] 有n个城市和m条单向道路,城市编号为1 ...

  4. COGS——T 2342&period; &lbrack;SCOI2007&rsqb;kshort &vert;&vert; BZOJ——T 1073

    http://www.cogs.pro/cogs/problem/problem.php?pid=2342 ★★☆   输入文件:bzoj_1073.in   输出文件:bzoj_1073.out   ...

  5. NOIP模拟2

    期望得分:100+100+100=300 实际得分:70+40+20=130 T1 [SCOI2007]kshort弱化版 Description 有n个城市和m条单向道路,城市编号为1~n.每条道路 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. 1066&colon; &lbrack;SCOI2007&rsqb;蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3545  Solved: 1771[Submit][Status] ...

  8. BZOJ 1070&colon; &lbrack;SCOI2007&rsqb;修车 &lbrack;最小费用最大流&rsqb;

    1070: [SCOI2007]修车 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 4936  Solved: 2032[Submit][Status] ...

  9. BZOJ1068&colon; &lbrack;SCOI2007&rsqb;压缩

    ... 1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 909  Solved: 566[Submit][Statu ...

随机推荐

  1. HYSBZ 4551 &lpar;树状数组&rpar; 采花

    题目:这里 题意: 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记, ...

  2. Open-Drain V&period;S&period; Push-Pull

    作者:crifan (http://bbs.chinaunix.net)邮箱:green-waste@163.com [Open-Drain与Push-Pull]GPIO的功能,简单说就是可以根据自己 ...

  3. ANDROID&lowbar;MARS学习笔记&lowbar;S03&lowbar;009&lowbar;GOOGLEMAP3

    一.代码 1.xml(1)main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLay ...

  4. 13年山东省赛 Boring Counting(离线树状数组or主席树&plus;二分or划分树&plus;二分)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 2224: Boring Counting Time Limit: 3 Sec   ...

  5. CSS3 grayscale滤镜图片变黑白实例页面

    在网站加入友情链接的LOGO时,因为不同logo颜色的问题,和主题色调可能产生冲突, 我选择用CSS3滤镜让logo变黑白,hover时变回原本的彩色 CSS代码: .gray { -webkit-f ...

  6. 二十二、oracle pl&sol;sql分类二 函数

    函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句.而在函数体内必须包含return语句返回的数据.我们可以使用create function来建立函数. 1).接下来通过一个案 ...

  7. Boost&period;Hana在visual studio 2017 rc中的残缺使用

    最新的visual studio还不支持hana,不知道vs2017正式版本出后会不会支持.等不及了,先用rc版试试吧. 1.从https://github.com/boostorg/hana下载或拉 ...

  8. Apache Spark1&period;1&period;0部署与开发环境搭建

    Spark是Apache公司推出的一种基于Hadoop Distributed File System(HDFS)的并行计算架构.与MapReduce不同,Spark并不局限于编写map和reduce ...

  9. css实现发光文字&comma;以及一点点js特效

    效果图: 代码如下: </head> <style> body{ background-color:#000; } .textArea{ font-size:100px; co ...

  10. LeetCode算法题-Binary Tree Level Order Traversal II(Java实现)

    这是悦乐书的第165次更新,第167篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第24题(顺位题号是107).给定二叉树,返回其节点值的自下而上级别顺序遍历(即从左到右 ...