题意:有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. 【windows】win10局域网共享文件夹

    1.打开 2.共享文件夹 另一台局域网电脑可根据共享的电脑ip访问就可以了[格式:\\ip] 如果右键文件夹没有共享选项

  2. LeetCode 540. 有序数组中的单一元素(Single Element in a Sorted Array) 42

    540. 有序数组中的单一元素 540. Single Element in a Sorted Array 题目描述 每日一算法2019/6/14Day 42LeetCode540. Single E ...

  3. kafka-manager 创建 topic【转】

    1,add cluster 添加cluster 添加cluster 选择一下kafka的版本 2,创建topic 添加topic 3,查看topic 查看topic

  4. 嵌入式02 STM32 实验07 串口通信

    STM32串口通信(F1系列包含3个USART和2个UART) 一.单片机与PC机串行通信研究目的和意义: 单片机自诞生以来以其性能稳定,价格低廉.功能强大.在智能仪器.工业装备以及日用电子消费产品中 ...

  5. 读文件时出现这个错误 'utf-8' codec can't decode byte 0xba in position 21: invalid start byte

    ''' file2 文件内容: 很任性wheniwasyoung ''' 源代码: f = open("file2",'r',encoding="utf-8") ...

  6. day12——生成器、推导式、简单内置函数

    day12 生成器 迭代器:python中内置的一种节省空间的工具 生成器的本质就是一个迭代器 迭代器和生成器的区别:一个是pyhton自带的,一个是程序员自己写的 写一个生成器 基于函数 在函数中将 ...

  7. Python 读取excel指定的列

    一.摘要 在这篇文章中: https://www.cnblogs.com/xiao987334176/p/9330368.html#autoid-4-5-2 介绍了使用 xlrd 模块,读取指定坐标的 ...

  8. 西门子S7-300 设置IP、子网掩码

    =============================================== 2019/7/17_第1次修改                       ccb_warlock == ...

  9. 四则运算自动出题之javaweb版

    四则运算出题机之JAVAWEB版 要求还是和之前的出题形式一样 begin.jpg <%@ page language="java" contentType="te ...

  10. C# 截取字符串方法总结

    第一种:根据单个分隔字符用split截取 string st="GT123_1"; string[] sArray=st.split("_"); //即可得到s ...