Albert_van @ 2022-07-14 19:52:13
RT,当时学得有些囫囵吞枣,刚碰到一道最短路题突然不懂了
我的理解,每次松弛时我们都会更新外面的
如下代码可以通过弱化版,本题则 WA68:
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int N=1e5+1.14514,inf=0x3f3f3f3f;
struct edg{int v,w;};
vector<edg> vc[N];
int f[N],s;bool vis[N];
struct cmp{bool operator()(int x,int y){return f[x]>f[y];}};
priority_queue<int,vector<int>,cmp> q;
void di_kstra(){
memset(f,inf,sizeof(f));
f[s]=0;q.push(s);
while(!q.empty()){
int now=q.top();q.pop();
if(vis[now]) continue;vis[now]=1;
for(auto [v,w]:vc[now]) if(f[v]>f[now]+w) f[v]=f[now]+w,q.push(v);
}
}
int main()
{
int n,m,u,v,w;scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;++i) scanf("%d%d%d",&u,&v,&w),vc[u].push_back((edg){v,w});
di_kstra();for(int i=1;i<=n;++i) printf("%d ",f[i]==inf?2147483647:f[i]);
}
求 dalao 解释下为什么我的想法是错的或者告诉我我写挂了,不胜感激。
by Albert_van @ 2022-07-14 19:52:46
代码中 f
数组即 dis
数组
by 小木虫 @ 2022-07-14 19:56:04
dis是会动态变化的,堆不支持内部数据修改
by 小木虫 @ 2022-07-14 19:56:08
@Albert_van
by Albert_van @ 2022-07-14 20:00:20
@小木虫 然而在更新 dis
时我们会额外往堆里面补充一个结点
by 小木虫 @ 2022-07-14 20:02:31
@Albert_van 不是,这个堆内部插入的时候如果之前更改了数据结构就被破坏了,整个数据结构会乱套
by Register_int @ 2022-07-14 20:07:20
@Albert_van 你家小根堆能带改,%%%
by Albert_van @ 2022-07-14 20:07:32
@小木虫 就,在更新 priority_queue
没有办法把堆里面的元素重排是吧
by Albert_van @ 2022-07-14 20:07:52
@Register_int 啊对,我伞兵
by Register_int @ 2022-07-14 20:09:26
@Albert_van 要是能带改还写平衡树干啥(
by 小木虫 @ 2022-07-14 20:10:50
@Albert_van 对的啊