zoukankan      html  css  js  c++  java
  • 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; 
    }

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

  • 相关阅读:
    HANDLE CreateThread()
    偷懒的一天-jQuery之事件与应用
    web进阶之jQuery操作DOM元素&&MySQL记录操作&&PHP面向对象学习笔记
    无聊的周五晚上
    闲里偷闲
    被蚊子和自己搞毁的一天
    数据库有点意思
    周一周一周。。一
    无聊到周六的教研室
    1.Nginx相关概念
  • 原文地址:https://www.cnblogs.com/RW-wbd/p/12564035.html
Copyright © 2011-2022 走看看