SPFA 的 SLF 容错+mrsz优化有误
  • 板块学术版
  • 楼主return_second
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/8/4 13:45
  • 上次更新2025/8/4 13:46:06
查看原帖
SPFA 的 SLF 容错+mrsz优化有误
1047309
return_second楼主2025/8/4 13:45

rt

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii; 
const int N=1e5+5,M=5e5+5;
int n,m,s;
vector<pii>g[N]; 
int dis[N];
int cnt[N],sum;
bool vis[N]; 
void SPFA()
{
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0;
    deque<int>q;//双端队列 
    q.push_back(s);
    vis[s]=true;
    while(!q.empty())
    {
        int u=q.front();
        q.pop_front();
        vis[u]=false;
    	for(pii i:g[u]) 
        {
            int v=i.first,w=i.second;
            if(dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;
                if(!vis[v])
                {
                    vis[v]=true;
                    cnt[v]++;
                    if(2<=cnt[v]&&cnt[v]<=sqrt(n))//mrsz优化 
						q.push_front(v);
                    if(!q.empty()&&dis[v]>dis[q.front()]+sqrt(sum))//SLF带容错
                	    q.push_front(v);
                	else
                		q.push_back(v);
                }
            }
        }
    }
}
int main()
{
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		g[u].push_back({v,w});
		sum+=w;
	}
	SPFA();
	for(int i=1;i<=n;i++)
		printf("%d ",dis[i]);
	return 0;
}
2025/8/4 13:45
加载中...