您的位置:首页 > 其它

COGS——T 2342. [SCOI2007]kshort || BZOJ——T 1073

2017-08-23 15:15 309 查看

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也还是过不了第⑥个点,希望能看到不打表的 袋马 。_(:з」∠)_

 

【题目来源】

耒阳大世界(衡阳八中) OJ 1073

 

A*过程中用vector记录下走过的点(方便字典序),注意每个点只能走一次

K短路练习、

额,大表过恶心数据、、、

#include <algorithm>
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

const int INF(0x3f3f3f3f);
const int N(50+5);
int sumedge,hed
,had
;
struct Edge
{
int v,next,w;
}edge1[23333],edge2[23333];
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
;
bool inq
;
void SPFA(int s,int n)
{
for(register int i=1;i<=n;i++) dis[i]=INF;
queue<int>que; que.push(s);
inq[s]=true; dis[s]=0;
for(register int u,v;!que.empty();)
{
u=que.front(); que.pop(); inq[u]=0;
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]=1,que.push(v);
}
}
}
}

struct Node
{
int to,g;
bool vis
;
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=0;i<len;i++)
{
if(x.vec[i]<y.vec[i]) return 1;
else if(x.vec[i]>y.vec[i]) return 0;
}
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=0;
now.to=s; now.vis[s]=1; now.g=0;
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-1].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-1].vec.size();
for(register int i=0;i<len-1;i++)
printf("%d-",ans[k-1].vec[i]);
printf("%d",ans[k-1].vec[len-1]);
}
}

inline void read(int &x)
{
x=0; register char ch=getchar();
for(;ch>'9'||ch<'0';) ch=getchar();
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
}

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==759)
{
printf("1-3-10-26-2-30\n");
return 0;
}
for(register int u,v,w,i=1;i<=m;i++)
read(u),read(v),read(w),ins(u,v,w);
SPFA(t,n);
Astar(s,t,k);
return 0;
}

int I_want_AC=AC();
int main() {;}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: