• 最短路问题之SPFA


    P3371 【模板】单源最短路径 题解

    这是一道蛋蛋的题,我用SPFA干掉了他,可是又因为老毛病if没打两个等号,这道题又成功的耗费了我20分钟!

    下面上源代码(内有注释):

        //SPFA
        #include<cstdio>
        #include<cstring>
        #include<vector>
        #include<queue>
        using namespace std;
        struct sd{
            int len,num;//len代表长度,num代表到达点的编号 
        }lin;
        queue<int> q;//队列操作 
        vector<sd> edge[10005]; //存储每一个点到达另一个点的编号,和他们之间的长度 
        int n,m,s;
        bool vis[10005];//数组变量vis判断元素是否在队列中false代表不再,true代表在。 
        int dis[10005];//存储当前从起点到达该点的最短距离。 
        void init();
        void outit();
        int main()
        {
            init();
            vis[s]=true;
            q.push(s);
            dis[s]=0;
            //--------------------我是华丽的分割线 --------------------\ 
            //SPFA主程序 
            while(!q.empty())//切记:SPFA是Bellman-Ford的队列优化,所以一定有队列操作 
            {//☣
                int now;
                now=q.front();
                q.pop();//出队 
                for(int i=edge[now].size()-1;i>=0;--i)
                {
                    if(dis[edge[now][i].num]>dis[now]+edge[now][i].len)//更新(详细变量说明见上) 
                    {
                        dis[edge[now][i].num]=dis[now]+edge[now][i].len;
                        if(vis[edge[now][i].num]==false)//入队操作 
                        {
                            vis[edge[now][i].num]=true;
                            q.push(edge[now][i].num);
                        }
                    }
                }
                vis[now]=false;//更改变量vis 
            }
            //--------------------我是华丽的分割线 --------------------\ 
            outit();
            return 0;
        }
        void init()//输入 
        {
            //memset(dis,0x7f7f7f7f7f,sizeof(dis));
            for(int i=1;i<=10000;++i)
            {
                dis[i]=2147483647;
            }
            scanf("%d%d%d",&n,&m,&s);
            int a,b,c;
            for(int i=1;i<=m;++i)
            {
                scanf("%d%d%d",&a,&b,&lin.len);
                lin.num=b;
                edge[a].push_back(lin);//注意(caution):这里的图是有方向的,所以不能双向Push_down() 
            }
        }
        void outit()//输出 
        {
            for(int i=1;i<=n;++i)
            {
                printf("%d ",dis[i]);
            }
        }
    
    
  • 相关阅读:
    Java数组和方法
    Java数组
    Java方法升级
    Java流程控制
    Java编译器的常量优化
    chrome使用技巧(看了定不让你失望)
    C 排序法
    mysql 线程池 数据库连接池
    php mysql
    深入剖析PHP输入流 php://input (转载 http://www.nowamagic.net/academy/detail/12220520)
  • 原文地址:https://www.cnblogs.com/mudrobot/p/13331119.html
Copyright © 2020-2023  润新知