【SDOI 2010】 魔法猪学院

【题目链接】

https://www.lydsy.com/JudgeOnline/problem.php?id=1975

【算法】

A*求k短路

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 5010
#define MAXM 200010
const double INF = 1e15;

int i,tot,n,m,u,v;
int head[MAXN],rhead[MAXN];
double dist[MAXN];
double w,val;

struct Edge
{
        int to;
        double w;
        int nxt;
} e[MAXM<<1];
struct info
{
        int s;
        double d;
        friend bool operator < (info a,info b)
        {
                return a.d + dist[a.s] > b.d + dist[b.s];
        }
} ;

inline void add(int u,int v,double w)
{
        tot++;
        e[tot] = (Edge){v,w,head[u]};
        head[u] = tot;
        tot++;
        e[tot] = (Edge){u,w,rhead[v]};
        rhead[v] = tot;
}
inline void dijkstra(int s)
{
        int i,u,v;
        double w;
        priority_queue< pair<double,int> > q;
        static bool vis[MAXN];
        memset(vis,false,sizeof(vis));
        while (!q.empty()) q.pop();
        for (i = 1; i <= n; i++) dist[i] = INF;
        dist[s] = 0;
        q.push(make_pair(0,s));
        while (!q.empty())
        {
                u = q.top().second;
                q.pop();
                if (vis[u]) continue;
                vis[u] = true;
                for (i = rhead[u]; i; i = e[i].nxt)
                {
                        v = e[i].to;
                        w = e[i].w;
                        if (dist[u] + w < dist[v])
                        {
                                dist[v] = dist[u] + w;
                                q.push(make_pair(-dist[v],v));
                        }
                }
        }
}
inline int Astar(int s,int t)
{
        int i,cnt = 0,v;
        double w,sum = 0;
        priority_queue< info > q;
        info cur;
        while (!q.empty()) q.pop();
        q.push((info){s,0});
        while (!q.empty())
        {
                cur = q.top();
                q.pop();
                if (cur.s == t)
                {
                        if (sum + cur.d <= val)
                        {
                                sum += cur.d;
                                cnt++;
                        } else return cnt;
                }
                for (i = head[cur.s]; i; i = e[i].nxt)
                {
                         v = e[i].to;
                        w = e[i].w;
                        q.push((info){v,cur.d+w});
                }
        }
        return 0;
}

int main()
{

        scanf("%d%d%lf",&n,&m,&val);
        for (i = 1; i <= m; i++)
        {
                scanf("%d%d%lf",&u,&v,&w);
                add(u,v,w);
        }
        dijkstra(n);
        printf("%d\n",Astar(1,n));

        return 0;

}

原文地址:https://www.cnblogs.com/evenbao/p/9270925.html

时间: 2024-08-01 17:26:21

【SDOI 2010】 魔法猪学院的相关文章

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

1835 魔法猪学院

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

洛谷 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 魔法猪学院(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>

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 今

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

[K短路] SDOI2010 魔法猪学院

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

BZOJ1975 [SDOI2010] 魔法猪学院

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

魔法猪学院(codevs 1835)

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