BZOJ 1975 魔法猪学院(K短路)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1975

题意:给出一个带权有向图。求一个最大的K使得前K短路的长度之和不大于给定的值Sum。

思路:首先,求出每个点到n的最短路。接着,使用优先队列,节点为(D,u)。首先将(dis[1],1)进队。由于D在任意时候为一条1到n的路径的长度,那么对于边<u,v,w>,D-dis[u]+w+dis[v]为一条新的路径的长度。

vector<pair<int,double> > g[N],g1[N];
double dis[N];
int n,m;
double Sum;

struct node
{
    int v;
    double dis;

    node(){}
    node(int _v,double _dis)
    {
        v=_v;
        dis=_dis;
    }

    int operator<(const node &a) const
    {
        return dis>a.dis;
    }
};

int inq[N];

void SPFA()
{
    int i;
    FOR1(i,n) dis[i]=dinf;
    dis[n]=0; inq[n]=1;
    queue<int> Q;
    Q.push(n);
    int u,v;
    double w;
    while(!Q.empty())
    {
        u=Q.front();
        Q.pop();

        inq[u]=0;
        FOR0(i,SZ(g1[u]))
        {
            v=g1[u][i].first;
            w=g1[u][i].second;
            if(dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;
                if(!inq[v]) inq[v]=1,Q.push(v);
            }
        }
    }
}

priority_queue<node> Q;

int cal()
{
    Q.push(node(1,dis[1]));
    int ans=0,i,v;
    node p;
    double w;
    while(!Q.empty())
    {
        p=Q.top();
        Q.pop();

        if(p.dis>Sum+EPS) break;

        if(p.v==n)
        {
            ans++;
            Sum-=p.dis;
            continue;
        }
        FOR0(i,SZ(g[p.v]))
        {
            v=g[p.v][i].first;
            w=g[p.v][i].second;
            Q.push(node(v,p.dis-dis[p.v]+w+dis[v]));
        }
    }
    return ans;
}

int main()
{
    RD(n,m); RD(Sum);
    int i,u,v;
    double w;
    FOR1(i,m)
    {
        RD(u,v);RD(w);
        g[u].pb(MP(v,w));
        g1[v].pb(MP(u,w));
    }
    SPFA();
    PR(cal());
}

BZOJ 1975 魔法猪学院(K短路),布布扣,bubuko.com

时间: 2024-08-08 05:31:33

BZOJ 1975 魔法猪学院(K短路)的相关文章

BZOJ 1975 魔法猪学院(A*+手写堆)

1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1941  Solved: 595 [Submit][Status][Discuss] Description iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与元素之间可以互相转换:能量守恒……. 能量守恒……iPig

[BZOJ1975][SDOI2010]魔法猪学院(k短路,A*)

1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2748  Solved: 883[Submit][Status][Discuss] Description iPig 在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了 解:众所周知,世界是由元素构成的:元素与元素之间可以互相转换:能量守恒……. 能量守恒……iPig

【刷题】 [SDOI2010]魔法猪学院/luoguP2483_k短路_可持久化可并堆(并没有)

题面 LuoguP2483 大意:给一张\(n\)个点,\(m\)条边的有向图,保证能从\(1\)号点到\(n\)号点,边有正实数边权\(e_i\),路径权值为边权和.问从\(1\)号点到\(n\)号点最多能选多少条本质不同的路径,使得这些路径权值和不超过给定的\(E\)? \(2\leq n\leq 5000,1\leq m\leq 200000,1\leq e_i,E\leq 10^7\) 题解 这是一道k短路裸题.因为你肯定要选前k短的.而且求k短路是一条条求出来的. 接下来的问题就是怎么

洛谷 P2483 [SDOI2010]魔法猪学院

P2483 [SDOI2010]魔法猪学院 k短路模板 1 #include<queue> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=10005; 7 int n,m,s,t,k,num,head1[maxn*100],head2[maxn*100],tot; 8 int nxt1[maxn*100]

Bzoj 1975: [Sdoi2010]魔法猪学院 dijkstra,堆,A*,K短路

1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1357  Solved: 446[Submit][Status][Discuss] Description iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与元素之间可以互相转换:能量守恒……. 能量守恒……iPig 今

[K短路] SDOI2010 魔法猪学院

魔法猪学院 题目背景 感谢@kczno1 @X_o_r 提供hack数据 题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与元素之间可以互相转换:能量守恒--. 能量守恒--iPig 今天就在进行一个麻烦的测验.iPig 在之前的学习中已经知道了很多种元素,并学会了可以转化这些元素的魔法,每种魔法需要消耗 iPig 一定的能量.作为 PKU 的顶尖

1835 魔法猪学院

1835 魔法猪学院 2010年 时间限制: 3 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与元素之间可以互相转换:能量守恒……. 能量守恒……iPig 今天就在进行一个麻烦的测验.iPig 在之前的学习中已经知道了很多种元素,并

BZOJ 1975 SDOI 2010 魔法猪学院 A*求K短路

题目大意:给出一张无向图,给出一个数值m,求出从1到N的前k短路的长度和>=数值m. 思路:注意!不能使用priority_queue,否则你会死的很惨..为了解惑,我去找了当年SD省选的原题,分明空间是256M,为什么BZOJ和BASHUOJ上都是64M??卡pq有意思么??? 思路很简单,就是按顺序求出这张图的前k短路,然后当m减成负数的时候就返回. CODE: #include <queue> #include <cstdio> #include <cstring

BZOJ 1975: [Sdoi2010]魔法猪学院 大水题 第k短路 spfa

https://www.lydsy.com/JudgeOnline/problem.php?id=1975 我好像到现在了第k短路都不会写,mdzz. 先spfa求出最短路,然后扫点存各种前置路径已经决定的最短路,小根堆暴力即可. 有向图要存反向边,写完才发现的,临时添成两种了,丑也没办法 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #