你看这么好的A*怎么输出0呢>wQ

P2483 【模板】k 短路 / [SDOI2010] 魔法猪学院

@[Xing_ke](/user/247546) 您的解题方案存在四个错误。 (1)您的代码: ``` bool operator<(const node &x)const{ x.dis<dis; } ``` 未返回值,则函数默认返回false,导致无法对优先队列内的元素进行排序,应该更改为: ``` bool operator<(const node &x)const{ return x.dis<dis; } ``` (2)您的代码: ``` for(int i=1;i<=n;++i) dis[i]=inf; ``` 未将dis[n]初始化为0,则无法正确求得最短距离,应该更改为: ``` for(int i=1;i<=n;++i) dis[i]=inf; dis[n] = 0; ``` (3)您的代码: ``` while(!Q.empty()){ ``` 应该是将q误写为Q了,q才是优先队列。应该更改为: ``` while(!q.empty()){ ``` (4)A\*搜索未能正确应用。A\*搜索的核心在于使用g(x)和h(x)来估算得到代价函数f(x),在本题环境下,g(x)相当于当前实际走的路程,h(x)则相当于距离顶点n的最短距离,该距离您已经使用SPFA算法计算得到,存放在数组dis中。阅读您的代码,结构体node中的数据域dis应该是总的代价函数f(x),但是走到当前顶点的实际代价g(x)在哪里呢?似乎并未体现。因此需要将结构体适当修改: ``` struct node{ int id; double gx, dis; bool operator<(const node &x)const{ return x.dis<dis; } }; ``` 对应的,在搜索可能的路径时,需要将原代码: ``` pos.dis-=dis[x]; // 这是什么意思?我没有看懂。 for(int i=head[x];i;i=e[i].nxt){ int y=e[i].to; double wc=e[i].val; q.push((node){y,dis[y]+pos.dis+wc}); } ``` 修改为(注意,初始压入的结点值需要在原有代码上做相应更改): ``` q.push((node){1,0,0}); // ... for(int i=head[x];i;i=e[i].nxt){ int y=e[i].to; double wc=e[i].val; q.push((node){y, pos.gx + wc, pos.gx + wc + dis[y]}); } ``` 修改完毕后,我尝试提交了一下,有一个测试点MLE,其他测试点Accepted。 有空请您访问我的[CSDN博客](https://blog.csdn.net/metaphysis),里面有我写的一本书,内有编程竞赛相关内容的介绍,并附有对应的练习题目(题目源自UVa OJ),可免费下载此书的PDF版本:[《C++,挑战编程——程序设计竞赛进阶训练指南》](https://blog.csdn.net/metaphysis/article/details/90288252)。可以的话,还烦您向对编程感兴趣的朋友推荐一下我的博客和书,感谢!
by metaphysis @ 2020-04-02 21:53:08


dalao~非常感谢!!!@[metaphysis](/user/333388) 能办的我会尽可能帮忙的,谢了>WQ
by Xing_ke @ 2020-04-02 22:12:26


>未返回值,则函数默认返回false @[metaphysis](/user/333388) 这一句是错误的,无返回值时返回为EAX寄存器中的值,可能为任意值,并非默认$false$。
by gxy001 @ 2020-08-24 16:07:50


@[gxy001](/user/55707) 您说的是哪个地方,我没有看明白,您能再明确一些吗?
by metaphysis @ 2020-08-24 20:29:34


@[metaphysis](/user/333388) 您的这句话(“未返回值,则函数默认返回false”)是错误的,不存在默认返回值,返回值可能为任意值
by gxy001 @ 2020-08-24 22:02:03


@[gxy001](/user/55707) 感谢您的指正。
by metaphysis @ 2020-08-25 07:33:58


|