求助最短路树
查看原帖
求助最短路树
538609
Neutralized楼主2022/8/3 09:25

正确的写法是,在 dijkstra 过程中,若通过 (u,v)(u,v) 松弛了 vv,则记录 fav=id(u,v)fa_v=id_{(u,v)} 表示最短路树上 vv 的连向祖先的边的编号。
但是如果将 favfa_v 记录为 uu 就 WA 50 pts。
请问原理是什么啊。 /fad

以下给出错误的写法:

inline void Dijkstra(){
	fill(dis,dis+n+1,+oo),vis.reset();
	dis[n]=0.0,q.push(node(n,dis[n]));
	while(q.size()){
		int u=q.top().u; q.pop();
		if(vis[u]) continue;
		vis[u]=1; gfore(u,R){
			int v=R.e[i].to; db w=R.e[i].w;
			if(dis[v]>dis[u]+w)
				dis[v]=dis[u]+w,fa[v]=u, //***here***
				q.push(node(v,dis[v]));
		}
	}
}

建立可并堆部分:

gfore(u,G){
	int v=G.e[i].to; db w=G.e[i].w;
	if(v==fa[u]) continue;
	root[u]=Mer(root[u],Cre(v,dis[v]-dis[u]+w));
} root[u]=Mer(root[u],root[fa[u]]);
2022/8/3 09:25
加载中...