题意:有N种化学元素,有M种转化关系,(u,v,L)表示化学物质由u变为v需要L能量,现在你有E能量,问最多有多少种不同的途径,使得1转为为N,且总能量不超过E。

思路:可以转为为带权有向图,即是求前K(K未知)短路,满足前K短路的边权和小于等于E,求K。

BZOJ上面提交的时间和空间都还不错。但是洛谷卡空间,我一顿操作还是没卡过去。

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define uint unsigned short int
#define rep(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int maxm=;
const double inf=0x7fffffff;
int Laxt1[maxn],Next1[maxm],cnt1; uint To1[maxm],To2[maxm];
int Laxt2[maxn],Next2[maxm],cnt2;
double dis[maxn],Len1[maxm],Len2[maxm];
int N,M,vis[maxn],ans; double E;
void read(int &x){
x=; char c=getchar();
while(c>''||c<'') c=getchar();
while(c>=''&&c<='') x=x*+c-'',c=getchar();
}
struct in{
uint x; float f;
in(){}
in(uint xx,float ff):x(xx),f(ff){};
friend bool operator <(in w,in v){
return w.f+dis[w.x]>v.f+dis[v.x];
}
};
void add(int u,int v,double L)
{
Next1[++cnt1]=Laxt1[u]; Laxt1[u]=cnt1; To1[cnt1]=v; Len1[cnt1]=L;
Next2[++cnt2]=Laxt2[v]; Laxt2[v]=cnt2; To2[cnt2]=u; Len2[cnt2]=L;
}
uint q1[]; int head=,tail=;
void dijkstra()
{
rep(i,,N-) dis[i]=inf;
q1[++head]=N;
while(head!=tail){
tail++; if(tail==N+) tail=;
uint u=q1[tail]; vis[u]=;
for(int i=Laxt2[u];i;i=Next2[i]){
uint v=To2[i];
if(dis[v]>dis[u]+Len2[i]){
dis[v]=dis[u]+Len2[i];
if(!vis[v]){
vis[v]=;
head++; if(head==N+) head=;
q1[head]=v;
}
}
}
}
}
void Astar(int K)
{
priority_queue<in>q;
rep(i,,N) vis[i]=;
q.push(in(,));
while(!q.empty()){
in T=q.top();q.pop();
if(T.f>E) return ;
int u=T.x; vis[u]++;
if(u==N){
E-=T.f;
if(E<) return ;
ans++;
continue;
}
if(vis[u]>=K) continue;
for(int i=Laxt1[u];i;i=Next1[i]){
int v=To1[i];
q.push(in(v,T.f+Len1[i]));
}
}
}
int main()
{
scanf("%d%d%lf",&N,&M,&E);
int u,v; double L;
rep(i,,M) {
read(u); read(v);
scanf("%lf",&L);
add(u,v,L);
}
dijkstra();
Astar(E/dis[]+);
printf("%d\n",ans);
return ;
}

BZOJ-1975: 魔法猪学院 (K短路:A*+SPFA)的更多相关文章

  1. bzoj 1975: [Sdoi2010]魔法猪学院 [k短路]

    1975: [Sdoi2010]魔法猪学院 裸题... 被double坑死了 #include <iostream> #include <cstdio> #include &l ...

  2. BZOJ-1975 魔法猪学院 K短路 (A*+SPFA)

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1323 Solved: 433 [Submit][Statu ...

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

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1941  Solved: 595 [Submit][Sta ...

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

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2748  Solved: 883[Submit][Statu ...

  5. BZOJ 1975: [Sdoi2010]魔法猪学院——K短路,A*

    传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1975 题意&简要做法 一张有向图,求出最多的互不相同的路径,满足路径长度之和\(\l ...

  6. BZOJ 1975 魔法猪学院(A*求K短路)

    显然每次贪心的走最少消耗的路径即可.那么也就是找出最短路,次短路,,,K短路之后消耗E的能量的最多的路径条数. 也就是裸的A*算法. #include <bits/stdc++.h> us ...

  7. BZOJ1975 [Sdoi2010]魔法猪学院 k短路

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1975 题意概括 给出一个无向图,让你走不同的路径,从1到n,路径长度之和不超过E,求最大路径条数. ...

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

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1357  Solved: 446[Submit][Statu ...

  9. K短路 (A*算法) [Usaco2008 Mar]牛跑步&[Sdoi2010]魔法猪学院

    A*属于搜索的一种,启发式搜索,即:每次搜索时加一个估价函数 这个算法可以用来解决K短路问题,常用的估价函数是:已经走过的距离+期望上最短的距离 通常和Dijkstra一起解决K短路 BZOJ1598 ...

  10. bzoj 1975 [Sdoi2010]魔法猪学院

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1758  Solved: 557[Submit][Statu ...

随机推荐

  1. scala 样例类

    一.case class 的特征 package com.jason.qianfeng case class Message(sender: String, receiver: String, bod ...

  2. 【Linux】修改root密码

    sudo passwd root 然后提示输入两次新密码就可以了

  3. JS系列:编程语言

    1.编程语言 html+css标记语言 js:轻量级的交互语言->全栈编程语言 - 面向对象: + C++ + JAVA + PHP + C# (.net doc) + JS - 面向过程 + ...

  4. javascript中 for in 、for 、forEach 、for of 、Object.keys().

    一 .for ..in 循环 使用for..in循环时,返回的是所有能够通过对象访问的.可枚举的属性,既包括存在于实例中的属性,也包括存在于原型中的实例.这里需要注意的是使用for-in返回的属性因各 ...

  5. Java基础知识点总结(二)

    “https://www.runoob.com/java” 1.Java运算符优先级 2.内置数据类型的包装类 抽象类Number是所有包装类(Integer.Long.Byte.Double.Flo ...

  6. python 之 面向对象 (异常处理)

    7.15 异常处理 1.什么是异常 异常是错误发生的信号,程序一旦出错,如果程序中还没有相应的处理机制,那么该错误就会产生一个异常抛出来,程序的运行也随之终止 2.一个异常分为三部分: 异常的追踪信息 ...

  7. 打印从1到n位数的最大值

    题目: 输入数字n,按顺序打印从1到最大的n位十进制数,如输入3,则打印从1.2.3一直到最大的3位数999 参考大数运算的方法.考虑到位数会很大,所以采用字符串的形式解决.对输入的n,创建一个长度为 ...

  8. win10 mars xlog编译

    win10 mars xlog编译   一. 环境准备 安装 cmake 以及 python2.7, 以及下载 ndk-r16b,并配置环境变量 NDK_ROOT 指向 ndk 路径. 如果是 Win ...

  9. MVC中常用的返回值方法

    我们上边所看到的Action都是return View();我们可以看作这个返回值用于解析一个aspx文件.而它的返回类型是ActionResult如 public ActionResult Inde ...

  10. custom drawer

    import 'package:flutter/material.dart'; main() => runApp(MaterialApp( home: HomePage(), )); class ...