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
    */
    
  • 相关阅读:
    cocos2d翻牌效果实现
    ShareSDK
    cocos2diphone版本选择
    UITextView设置透明背景
    iOS常用第三方类库
    CCMenu布局
    macosx下安装mysql
    mac截图
    iPhone对OpenGL ES的支持
    cocos2d下action和线程
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/9004938.html
Copyright © 2011-2022 走看看