求SPFA玄学优化期望时间复杂度和证明
  • 板块学术版
  • 楼主zjh114514
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/9/12 21:36
  • 上次更新2023/11/2 21:08:57
查看原帖
求SPFA玄学优化期望时间复杂度和证明
773944
zjh114514楼主2023/9/12 21:36

提交记录

#include<bits/stdc++.h>
using namespace std;
int getrand(int l,int r){
    int total=r-l+1;
    int x=1ll*rand()*rand();
    int y=rand();
    return l+((x^y)%total+total)%total;
}
const int N=1e5+5;
vector<pair<int,int>>to_and_w[N];
int dis[N];
bool vis[N];
int stk[N];
int total;
bool cmp(int x,int y){
    return dis[x]>dis[y];
}
void SPFA(int n,int s){
    fill(dis,dis+N,(int)1e9);
    dis[s]=0;
    vis[s]=1;
    stk[total++]=s;
    while(total){
        if(!(getrand(1,(int)1e8)%(total))){
            sort(stk,stk+total,cmp);
        }
        int u=stk[--total];
        vis[u]=0;
        for(auto i:to_and_w[u]){
            int v=i.first,w=i.second;
            if(dis[u]+w<dis[v]){
                dis[v]=dis[u]+w;
                if(!vis[v]){
                    vis[v]=1;
                    stk[total++]=v;
                }
            }
        }
    }
}
int main(){
    srand(time(0));
    ios::sync_with_stdio(0);
    int n,m,s;
    cin>>n>>m>>s;
    while(m--){
        int u,v,w;
        cin>>u>>v>>w;
        to_and_w[u].push_back({v,w});
    }
    SPFA(n,s);
    for(int i=1;i<=n;i++){
        cout<<dis[i]<<" ";
    }
    return 0;
}
2023/9/12 21:36
加载中...