SPFA(还是稍微写写吧,虽然没什么用)

为什么SPFA废了呢,因为它的时间复杂度不稳定,就是说别人可以完全出一个图来卡死你,其实SPFA就是Bellman-Ford算法的队列优化,在某些情况下跑的比它快。

#include<bits/stdc++.h>
using namespace std;
int n,m,p,f[1000][1000],dis[1000],amount[1000],visit[1000],path[1000];
queue<int> que;
void input()
{
    memset(dis,0x7f,sizeof(dis));
    memset(f,0x7f,sizeof(f));
    int aa,ss,weight;
    cin>>n>>m>>p;
    dis[p]=0;
    for(int i=1;i<=m;i++)
    {
        f[i][i]=0;
        cin>>aa>>ss>>weight;
        f[aa][ss]=f[ss][aa]=weight;
    }
    for(int i=1;i<=n;i++)
    path[i]=p;
    path[p]=0;
}
bool SPFA(int source)
{
    que.push(source);
    visit[source]=1;
    amount[source]++;
    while(!que.empty())
    {
        int b=que.front();
        visit[b]=0;
        que.pop();
        for(int i=1;i<=n;i++)
        {
            if(f[b][i]!=0x7f7f)
            {
                if(dis[i]>dis[b]+f[b][i])
                {
                    dis[i]=dis[b]+f[b][i];
                    path[i]=b;
                if(!visit[i])
                {
                que.push(i);
                amount[i]++;
                if(amount[i]>=n)
                return false;
                visit[i]=1;
                }
                }
            }
        }
    }
    return true;
}
void dnn(int i)
{
    stack<int> s;
    cout<<p;
    while(path[i]!=0)
    {
        s.push(i);
        i=path[i];
    }
    while(!s.empty())
    {
        cout<<"->"<<s.top();
        s.pop();
    }
}
void print()
{
    for(int i=1;i<=n;i++)
    if(i!=p)
    {
        cout<<i<<' '<<':'<<' '<<dis[i]<<' '<<"路径"<<":"<<' ';
        dnn(i);
        cout<<endl;
    }
}
int main()
{
    input();
    if(SPFA(p))
    print();
    else 
    cout<<"有负权回路!";
    return 0; 
}

很久前学的算法真是有满满的回忆呢!

猜你喜欢

转载自www.cnblogs.com/RW-wbd/p/12564035.html