题意:有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. Ubuntu 定时关机

    sudo shutdown +120 Shutdown scheduled for Sat 2019-09-21 23:48:44 CST, use 'shutdown -c' to cancel.

  2. PHP设计模式 - 状态模式

    状态模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以 ...

  3. 026 SSM综合练习02--数据后台管理系统--数据库表创建及SSM环境搭建

    1.数据库准备 本项目我们Oracle数据库,Oracle 为每个项目创建单独user,oracle数据表存放在表空间下,每个用户有独立表空间. (1)采用数据库管理员账号:SYSTEM,再配合数据库 ...

  4. 17 SpringMVC response响应

    1.Model.ModelMap和ModelAndView的使用详解 Spring-MVC在请求处理方法可出现和返回的参数类型中,最重要就是Model和ModelAndView了,对于MVC框架,控制 ...

  5. 向DataGrid数据表格增加查询搜索框

    向DataGrid数据表格增加查询搜索框 效果如下: js代码: $(function(){ var dg = $('#dg').datagrid({ url:"${pageContext. ...

  6. day23——继承

    day23 初识继承 字面意思:儿子可以完全使用父亲的所有内容 专业角度:如果B类继承A类, B类就称为子类.派生类 A类就称为父类.基类.超类 面向对象三大特性:继承.封装.多态 继承:单继承.多继 ...

  7. C语言指针的一些用法

    指针是C语言的灵魂,精华之所在.指针强大而危险,用得好是一大利器,用得不好是一大潜在危害.正是指针具有强大而又危险的特性,加上指针比较难,很多人用的不好,所以越是封装程度高的语言,越是没有指针的&qu ...

  8. python_并行与并发、多线程

    问题一: 计算机是如何执行程序指令的? 问题二: 计算机如何实现并发的? 轮询调度实现并发执行 程序1-8轮询完成,才再CPU上运行 问题三: 真正的并行需要依赖什么? 并行需要的核心条件 多进程实现 ...

  9. pytest_02-用例运行规则

    用例设计原则 文件名以test_*.py文件和*_test.py 以test_开头的函数 以Test开头的类 以test_开头的方法 所有的包pakege必须要有__init__.py文件 help帮 ...

  10. sql server 压缩日志文件

    USE [master] GO ALTER DATABASE TestDB SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE TestDB SET ...