zoukankan      html  css  js  c++  java
  • spfa

    #include<bits/stdc++.h>
    using namespace std;
    
    int n,m,s;//点数,边数,出发点
    int u[500005],v[500005],w[500005];
    int first[10005],nextt[500005];
    int dis[10005];
    int book[500005];
    queue<int> node;
    
    void clean()
    {
        for(int i=1;i<=n;i++)
        {
            dis[i]=2147483647;
        } 
        dis[s]=0;//dis的初始化,当前赋值为0,其余赋值为正无穷
        for(int i=0;i<=500004;i++)
        {
            nextt[i]=-1;
        }
        for(int i=0;i<=10004;i++)
        {
            first[i]=-1;//第一条出边以及每一边的后一边赋值为空 
        }
    }
    
    int main()
    {
        cin>>n
        >>m
        >>s;
        clean();
        for(int i=1;i<=m;i++)
        {
            cin>>u[i]>>v[i]>>w[i];
            nextt[i]=first[u[i]];//上一边让位,接在当前边后面 
            first[u[i]]=i; //当前边上位 
        }
        node.push(s);
        while(!node.empty())
        {
            int now_node=node.front();
            int k=first[now_node];
            book[now_node]=0;//出队标记 
            node.pop();
            while(k!=-1)//对当前点的每一条出边进行访问 
            {
                if(dis[v[k]]>dis[u[k]]+w[k])//如果松弛成功 
                {
                    dis[v[k]]=dis[u[k]]+w[k];//更改最短路 
                    if(book[v[k]]==0)//不再队列中 
                    {
                        node.push(v[k]);
                        book[v[k]]=1;//打上标记 
                    }
                }
                k=nextt[k];//尝试该点的下一条出边 
            }
        }
        for(int i=1;i<=n;i++)
        {
            cout<<dis[i]<<" ";
        }
        return 0;
    }

    记得入队标记

  • 相关阅读:
    派生类的构造函数
    继承和派生
    自增自减运算符的重载(强制类型转换运算符重载)
    流插入和流提取运算符的重载
    动态数组类的设计
    函数的返回值
    赋值运算符的重载
    运算符重载
    常量对象函数引用和参数传递
    理解ASP.NET MVC的路由系统
  • 原文地址:https://www.cnblogs.com/KyleDeng/p/9347263.html
Copyright © 2011-2022 走看看