zoukankan      html  css  js  c++  java
  • K短路

    最近在学A*,又因为某位大佬讲了一下k短路算法

    所以就拿来练练。然而以我的能力,在考试中并不会考到。

    题目是[SDOI2010]魔法猪学院。

    然而luogu数据有加强。没有左偏堆过不了233

    // luogu-judger-enable-o2
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdlib>
    #include<vector>
    #include<queue>
    using namespace std;
    struct node
    {
        int point;
        double value;
        bool operator < (const node& a)const
        {
            return value>a.value;
        }
        node (int pint,double dus)
        {
            point=pint;
            value=dus;
        }
    };
    vector<node>tor[6010];
    vector<node>bac[6010];
    int n,m,a,b;
    double e,distanc;
    double dis[6010];
    bool inque[6010];
    void SPFA(int begin,int end)
    {
        for(int i=1;i<=n;i++)
            dis[i]=0x7ffffff;
        dis[begin]=0;
        inque[begin]=true;
        queue<int>q;
        q.push(begin);
        while(!q.empty())
        {
            int pas=q.front();
            q.pop();
            inque[pas]=false;
            for(int i=0;i<bac[pas].size();i++)
            {
                int nxt_1=bac[pas][i].point;
                double nxt_2=bac[pas][i].value;
                if(dis[nxt_1]>dis[pas]+nxt_2)
                {
                    dis[nxt_1]=dis[pas]+nxt_2;
                    if(!inque[nxt_1])
                    {
                        inque[nxt_1]=true;
                        q.push(nxt_1);
                    }
                }
            }
        }
    }
    long long A_star(int begin,int end)
    {
        priority_queue<node>q;
        q.push(node(begin,dis[begin]));
        long long ans=0;
        while(!q.empty())
        {
            node pas=q.top();
            q.pop();
            int pas_1=pas.point;
            double pas_2=pas.value;
            if(pas_2>e)
                return ans;
            if(pas_1==n)
            {
                e-=pas_2;
                ans+=1;
            }
            for(int i=0;i<tor[pas_1].size();i++)
                q.push(node(tor[pas_1][i].point,pas_2-dis[pas_1]+tor[pas_1][i].value+dis[tor[pas_1][i].point]));
        }
        return ans;
    }
    int main()
    {
        scanf("%d%d%lf",&n,&m,&e);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%lf",&a,&b,&distanc);
            tor[a].push_back(node(b,distanc));
            bac[b].push_back(node(a,distanc));
        }
        SPFA(n,1);
        printf("%lld",A_star(1,n));
    }
    /*
    4 6 15
    1 2 1.5
    2 1 1.5
    1 3 3
    2 3 1.5
    3 4 1.5
    1 4 1.5
    */
    
  • 相关阅读:
    使用Junit对Spring进行单元测试实战小结
    【VBA编程】02.调试VBA程序
    【VBA编程】01.第一个VBA程序Hello world
    VBA验证工作表是否存在
    VBA对指定单元格填充颜色并且赋值
    Excle中range的一些用法
    Debug.print的用法
    EXCLE图形插入实例
    DB2建立不记录日志的表
    Excle快速输入√与×
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/9004938.html
Copyright © 2011-2022 走看看