本人蒟蒻,写一个SPFA,TLE三个

P1629 邮递员送信

每一个点跑一边Spfa复杂度显然是爆炸的
by Qiuly @ 2019-02-02 13:01:15


所以不妨建两个图,一个原图,一个反图,然后对两个图都跑一边Spfa,一样可以得出答案
by Qiuly @ 2019-02-02 13:02:12


比如说A*,在建立估值数组的时候,就是需要见反图跑spfa,因为我们要知道现在每个点到终点的距离。 同样的道理,现在我们要知道每个点到起点的距离,所以建反图再跑一次即可
by Qiuly @ 2019-02-02 13:04:00


这样的话复杂度只有 O(nk)
by Qiuly @ 2019-02-02 13:04:19


如果还过不了就换成 堆优Dij 吧。
by Qiuly @ 2019-02-02 13:05:03


@[maple666](/space/show?uid=85600)
by Qiuly @ 2019-02-02 13:05:12


堆优Dij 板子 ```cpp priority_queue<pair<int,int> > q; inline void dijstra(){ F(i,n)dis[i]=inf; dis[1]=0;q.push(make_pair(dis[1],1)); while(!q.empty()){ int x=q.top().second;q.pop(); if(vis[x])continue; vis[x]=true; for(register int i=head[x];i!=0;i=edge[i].next){ int to=edge[i].to; int w=edge[i].w; if(dis[x]+w<dis[to]){ dis[to]=dis[x]+w; q.push(make_pair(-dis[to],to)); } } }return; } ```
by Qiuly @ 2019-02-02 13:09:29


@[Qiuly](/space/show?uid=113190) 蟹蟹神犇光环照耀!感谢大佬指教!
by maple666 @ 2019-02-02 13:12:22


@[Qiuly](/space/show?uid=113190) 我太蒻了,大佬指教一下怎么建反图呗
by maple666 @ 2019-02-02 13:19:35


```cpp inline void add(int u,int v,int w){ G[1][++cnt[1]].nxt=head[1][u],G[1][cnt[1]].to=v,G[1][cnt[1]].val=w,head[1][u]=cnt[1]; G[2][++cnt[2]].nxt=head[2][v],G[2][cnt[2]].to=u,G[2][cnt[2]].val=w,head[2][v]=cnt[2]; } ``` 其中 [1] 是正图,[2] 是反图
by Qiuly @ 2019-02-02 13:25:09


上一页 | 下一页