zoukankan      html  css  js  c++  java
  • Luogu P2483 【模板】k短路([SDOI2010]魔法猪学院)

      说实话,看到这道题的洛谷评级我傻了(传说中的最高难度)

      然后看完题目才确定这真的是一道k短路的裸题。

      也就敲了个A*吧,15分钟竟然没有调试一遍过。

      欧洲玄学。

      看题目,主要是找几条从1走到n的路加起来小于等于给定的E即可。

      所以就是一道k短路。

      A*和DJ很像,就是把堆的比较操作从当前路径长度+该点到n点的长度。

      后面的那个就是估价函数了,打SPFA或DJ都可以。

      然后STL堆搞一波就可以了。

      CODE

    // luogu-judger-enable-o2
    #include<cstdio>
    #include<queue>
    using namespace std;
    typedef double DB;
    const int N=5005;
    struct data
    {
        int num;
        DB s;
        bool operator <(const data &a) const 
        {
            return a.s<s;
        }
    };
    struct Astar
    {
        int num;
        DB s,rs;
        bool operator <(const Astar &a) const 
        {
            return a.s+a.rs<s+rs;
        }
    };
    priority_queue <data> small;
    priority_queue <Astar> tree;
    vector <int> a[N],b[N];
    vector <DB> l[N],rl[N];
    int n,m,i,x,y,ans;
    DB z,tot,dis[N],sum;
    bool vis[N];
    inline void read(int &x)
    {
        x=0; char ch=getchar();
        while (ch<'0'||ch>'9') ch=getchar();
        while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    }
    int main()
    {
        read(n); read(m); scanf("%lf",&tot);
        for (i=1;i<=m;++i)
        {
            read(x); read(y); scanf("%lf",&z);
            a[x].push_back(y); l[x].push_back(z);
            b[y].push_back(x); rl[y].push_back(z);
        }
        for (i=1;i<=n;++i)
        dis[i]=1e9;
        dis[n]=0;
        small.push((data){n,0});
        while (!small.empty())
        {
            int now=small.top().num; small.pop();
            if (vis[now]) continue;
            vis[now]=1;
            for (i=0;i<b[now].size();++i)
            {
                int k=b[now][i];
                if (dis[k]>dis[now]+rl[now][i])
                {
                    dis[k]=dis[now]+rl[now][i];
                    small.push((data){k,dis[k]});
                }
            }
        }
        tree.push((Astar){1,0,dis[1]});
        while (!tree.empty())
        {
            int now=tree.top().num; DB temp=tree.top().s; tree.pop();
            if (now==n) { if (sum+temp>tot) { printf("%d",ans); return 0; } else ans++,sum+=temp; }
            for (i=0;i<a[now].size();++i)
            tree.push((Astar){a[now][i],temp+l[now][i],dis[a[now][i]]});
        }
        return 0;
    }
  • 相关阅读:
    c语言简易文法
    词法分析实验报告
    词法分析程序
    scrapy-splash的安装和使用
    scrapy关于将数据保存进mysql数据库及问题解决(增删查改)
    关于scrapy的一些练习
    安装python框架scrapy
    ssm中遇到的一些问题及解决办法
    安装PIL和pytesseract,用Pycharm自动化测试,验证码登陆
    selenium+pycham自动化登陆qq邮箱发送邮件
  • 原文地址:https://www.cnblogs.com/cjjsb/p/8278579.html
Copyright © 2011-2022 走看看