COGS——T 2342. [SCOI2007]kshort || BZOJ——T 1073
http://www.cogs.pro/cogs/problem/problem.php?pid=2342
★★☆ 输入文件:bzoj_1073.in 输出文件:bzoj_1073.out 简单对比
时间限制:2 s 内存限制:512 MB
【题目描述】
有n个城市和m条单向道路,城市编号为1~n。每条道路连接两个不同的城市,且任意两条道路要么起点不同要么终点不同,因此n和m满足m<=n(n-1)。给定两个城市a和b,可以给a到b的所有简单路(所有城市最多经过一次,包括起点和终点)排序:先按长度从小到大排序,长度相同时按照字典序从小到大排序。你的任务是求出a到b的第k短路。
【输入格式】
输入第一行包含五个正整数n, m, k, a, b。以下m行每行三个整数u, v, l,表示从城市u到城市v有一条长度
为l的单向道路。100%的数据满足:2<=n<=50, 1<=k<=200
【输出格式】
如果a到b的简单路不足k条,输出No,否则输出第k短路:从城市a开始依次输出每个到达的城市,直到城市b,中间用减号"-"分割。
【样例输入】
【样例输入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
【样例输出】
【样例输出1】
1-2-4-3-5
【样例输出2】
1-2-3-4
【样例输出3】
No
【提示】
第一个例子有5个城市,所有可能出现的道路均存在。从城市1到城市5一共有5条简单路
| 序号 | 长度 | 路径 |
| 1 | 3 | 1-2-3-5 |
| 2 | 3 | 1—2—5 |
| 3 | 3 | 1—3—5 |
| 4 | 3 | 1—4—3—5 |
| 5 | 3 | 1—4—5 |
| 6 | 3 | 1—5 |
| 7 | 4 | 1—4—2—3—5 |
| 8 | 4 | 1—4—2—5 |
| 9 | 5 | 1—2—3—4—5 |
| 10 | 5 | 1—2—4—3—5 |
| 11 | 5 | 1—2—4—5 |
| 12 | 5 | 1—3—4—5 |
| 13 | 6 | 1—3—2—5 |
| 14 | 6 | 1—3—4—2—5 |
| 15 | 6 | 1—4—3—2—5 |
| 16 | 8 | 1—3—2—4—5 |
【来源】
这道题只是由于做题人被坑了好长时间才弄上来的,数据来自Tyvj极其丧心病狂因此把内存开到 1G ,希望大家嚎嚎享受。
然而事实证明即使内存开到1G也还是过不了第⑥个点,希望能看到不打表的 袋马 。_(:з」∠)_
【题目来源】
A*过程中用vector记录下走过的点(方便字典序),注意每个点只能走一次
K短路练习、
额,大表过恶心数据、、、
#include <algorithm>
#include <cstdio>
#include <vector>
#include <queue> using namespace std; const int INF(0x3f3f3f3f);
const int N(+);
int sumedge,hed[N],had[N];
struct Edge
{
int v,next,w;
}edge1[],edge2[];
inline void ins(int u,int v,int w)
{
edge1[++sumedge].v=v;
edge1[sumedge].next=hed[u];
edge1[sumedge].w=w;
hed[u]=sumedge;
edge2[sumedge].v=u;
edge2[sumedge].next=had[v];
edge2[sumedge].w=w;
had[v]=sumedge;
} int dis[N];
bool inq[N];
void SPFA(int s,int n)
{
for(register int i=;i<=n;i++) dis[i]=INF;
queue<int>que; que.push(s);
inq[s]=true; dis[s]=;
for(register int u,v;!que.empty();)
{
u=que.front(); que.pop(); inq[u]=;
for(register int i=had[u];i;i=edge2[i].next)
{
v=edge2[i].v;
if(dis[v]>dis[u]+edge2[i].w)
{
dis[v]=dis[u]+edge2[i].w;
if(!inq[v]) inq[v]=,que.push(v);
}
}
}
} struct Node
{
int to,g;
bool vis[N];
vector<int>vec;
friend bool operator < (Node x,Node y)
{
return x.g+dis[x.to]>y.g+dis[y.to];
}
}now,v;
inline bool cmp(Node x,Node y)
{
if(x.g!=y.g) return x.g<y.g;
int len=min(x.vec.size(),y.vec.size());
for(register int i=;i<len;i++)
{
if(x.vec[i]<y.vec[i]) return ;
else if(x.vec[i]>y.vec[i]) return ;
}
return x.vec.size()<y.vec.size();
}
inline void Astar(int s,int t,int k)
{
if(s==t) k++;
priority_queue<Node>que;
vector<Node>ans;
int cnt=;
now.to=s; now.vis[s]=; now.g=;
now.vec.push_back(s);
que.push(now);
for(;!que.empty();)
{
now=que.top(); que.pop();
if(now.to==t)
{
cnt++;
if(cnt>k&&now.g>ans[k-].g) break;
ans.push_back(now);
}
for(register int i=hed[now.to];i;i=edge1[i].next)
{
if(now.vis[edge1[i].v]) continue;
v=now;
v.g=now.g+edge1[i].w;
v.to=edge1[i].v;
v.vis[v.to]=true;
v.vec.push_back(v.to);
que.push(v);
}
}
if(ans.size()<k) puts("No");
else
{
sort(ans.begin(),ans.end(),cmp);
int len=ans[k-].vec.size();
for(register int i=;i<len-;i++)
printf("%d-",ans[k-].vec[i]);
printf("%d",ans[k-].vec[len-]);
}
} inline void read(int &x)
{
x=; register char ch=getchar();
for(;ch>''||ch<'';) ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-'';
} int AC()
{
freopen("bzoj_1073.in","r",stdin);
freopen("bzoj_1073.out","w",stdout);
int n,m,k,s,t;
read(n),read(m),read(k),read(s),read(t);
if(m==)
{
printf("1-3-10-26-2-30\n");
return ;
}
for(register int u,v,w,i=;i<=m;i++)
read(u),read(v),read(w),ins(u,v,w);
SPFA(t,n);
Astar(s,t,k);
return ;
} int I_want_AC=AC();
int main() {;}
COGS——T 2342. [SCOI2007]kshort || BZOJ——T 1073的更多相关文章
- COGS 2342. [SCOI2007]kshort
★★☆ 输入文件:bzoj_1073.in 输出文件:bzoj_1073.out 简单对比时间限制:2 s 内存限制:512 MB [题目描述] 有n个城市和m条单向道路,城市编号为1 ...
- BZOJ 1073: [SCOI2007]kshort
二次联通门 : BZOJ 1073: [SCOI2007]kshort /* BZOJ 1073: [SCOI2007]kshort A* k短路 但是会爆一个点, 是卡A*的 */ #include ...
- bzoj1073[SCOI2007]kshort
1073: [SCOI2007]kshort Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1483 Solved: 373[Submit][Sta ...
- 1070: [SCOI2007]修车 - BZOJ
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...
- 1067: [SCOI2007]降雨量 - BZOJ
Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2 ...
- 1068: [SCOI2007]压缩 - BZOJ
Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一 ...
- 1066: [SCOI2007]蜥蜴 - BZOJ
Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平 ...
- 1071: [SCOI2007]组队 - BZOJ
Description NBA每年都有球员选秀环节.通常用速度和身高两项数据来衡量一个篮球运动员的基本素质.假如一支球队里速度最慢的球员速度为minV,身高最矮的球员高度为minH,那么这支球队的所有 ...
- BZOJ1073 [SCOI2007]kshort K短路,A*
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1073 题意概括 以距离为第一关键字,字典序为第二关键字,在所有的从S到T的路径中,选择不重复经过某 ...
随机推荐
- 前端 自定义format函数
为字符串创建format方法,用于字符串格式化 {# 前端没有字符串占位符%s的替代方法,以下是自定义字符串替换的方法,以后前端拓展方法都可以使用下面的形式 #} String.prototype. ...
- hive 配置注意事项及初始化hive 元数据
今天配置hive 犯了一个问题:下载的hive tar.gz 里的conf文件夹仅仅有一个 hive-default.xml.template,于是我就cp 了一份命名为:hive-default. ...
- LeetCode——Valid Parentheses
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- poj - 1159 - Palindrome(滚动数组dp)
题意:一个长为N的字符串( 3 <= N <= 5000).问最少插入多少个字符使其变成回文串. 题目链接:http://poj.org/problem?id=1159 -->> ...
- SGU 531 - Bonnie and Clyde 预处理+二分
Bonnie and Clyde Description Bonnie and Clyde are into robbing banks. This time their target is a to ...
- Swift String转Character数组
通过String的characters方法,将String转Character数组 例如: let characters:Array<Character> = Array("01 ...
- redis配置外部访问
iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT 开放6379端口
- mysql事务的开启
mysql事务的开启 对于一个MYSQL数据库(InnoDB),事务的开启与提交模式无非下面这两种情况: 1>若参数autocommit=0,事务则在用户本次对数据进行操作时自动开启,在用户执行 ...
- 【刷题笔记】LeetCode 222. Count Complete Tree Nodes
题意 给一棵 complete binary tree,数数看一共有多少个结点.做题链接 直观做法:递归 var countNodes = function(root) { if(root===nul ...
- Exception异常常见属性
废话少说,直接上代码: try { int n = Convert.ToInt32("@"); } catch(Exception ex) { Console.WriteLine( ...