1 条题解
-
0
自动搬运
来自洛谷,原作者为

y2823774827y
喜欢D人的菜鸡搬运于
2025-08-24 21:42:05,当前版本为作者最后更新于2018-10-03 08:43:54,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
貌似下面的题解已全被hack
分析
dalao就直接看程序吧- 采用的是普通的bfs入队列,正确性?先是不太疲劳时会直接入队列;后面来的情况必须是当前路径小于之前确定的才有可能为解:因为已经更疲劳了,路径总得小点吧(对同一点入队列分析)
- 该题主要难点其实在于如何存入路径,每个点的前驱会随bfs更新而变化,所以本题这样似乎行不通
留给dalao们尝试吧,一般spfa_bfs都习惯用标准queue存入点。这里自己定义队列,用结构体去维护值
ps:由于蒟蒻能力有限,如有hack数据希望私信
//n<=10000, m<=200000 #include<cstdio> #include<cstring> using namespace std; struct node{ int to,next,d; }dis[200010]; struct code{ int u,d,dfn,pre; }que[100000010]; int n,m,num,inf=0x3f3f3f3f,tail,hea; int last[10010],head[10010],lu[10010]; inline void add(int u,int v,int d){ dis[++num].to=v; dis[num].d=d; dis[num].next=head[u]; head[u]=num; } void cout(int x){ if(!x) return; cout(que[x].pre); printf("%d ",que[x].u); } void bfs(){ memset(lu,inf,sizeof(lu)); lu[1]=0; que[++tail].u=1; while(hea<=tail){ hea++; int u=que[hea].u,dfn=que[hea].dfn,d=que[hea].d; for(int i=head[u];i;i=dis[i].next){ int v=dis[i].to; if(lu[v]>d+dfn+dis[i].d){ lu[v]=d+dfn+dis[i].d; tail++; que[tail]=(code){v,lu[v],dfn+1,hea}; last[v]=tail; } } } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;++i){ int u,v,d; scanf("%d%d%d",&u,&v,&d); add(u,v,d); } bfs(); printf("%d\n",lu[n]); cout(last[n]); return 0; }
- 1
信息
- ID
- 1908
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者