欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ1975


题意概括

  给出一个无向图,让你走不同的路径,从1到n,路径长度之和不超过E,求最大路径条数。


题解

  k短路模板题。


代码

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=5005,M=200002;
const double Inf=1e300;
struct Gragh{
int cnt,y[M*2],nxt[M*2],fst[N],vis[N],q[N],n;
double z[M*2],dis[N];
void clear(int n_){
cnt=0,n=n_;
memset(fst,0,sizeof fst);
}
void add(int a,int b,double c){
y[++cnt]=b,z[cnt]=c,nxt[cnt]=fst[a],fst[a]=cnt;
}
void spfa(int st){
int X,Y,head=0,tail=0,qmod=N-3;
for (int i=1;i<=n;i++)
dis[i]=Inf;
memset(vis,0,sizeof vis);
dis[st]=0,vis[q[tail=tail%qmod+1]=st]=1;
while (head!=tail){
vis[X=q[head=head%qmod+1]]=0;
for (int i=fst[X];i;i=nxt[i])
if (dis[X]+z[i]<dis[Y=y[i]]){
dis[Y]=dis[X]+z[i];
if (!vis[Y])
vis[q[tail=tail%qmod+1]=Y]=1;
}
}
}
}yg,g;
const int S=2000000;
int id[S],heap_size;
double now[S];
double h(int x){return g.dis[x];}
double G(int x){return now[x]+h(id[x]);}
void heap_clear(){heap_size=0;}
bool heap_empty(){return heap_size==0;}
bool heap_cmp(int a,int b){return G(a)<G(b);}
void heap_down(){
for (int i=1,j=i<<1;j<=heap_size;i=j,j=i<<1){
j+=j<heap_size&&!heap_cmp(j,j+1);
if (heap_cmp(i,j))
break;
swap(id[i],id[j]),swap(now[i],now[j]);
}
}
void heap_up(){
for (int i=heap_size,j=i>>1;i>1;i=j,j=i>>1)
if (!heap_cmp(j,i))
swap(id[i],id[j]),swap(now[i],now[j]);
else
break;
}
void heap_pop(){
id[1]=id[heap_size];
now[1]=now[heap_size--];
heap_down();
}
void heap_push(int x,double nowdis){
id[++heap_size]=x;
now[heap_size]=nowdis;
heap_up();
}
int n,m;
double E;
int solve(){
int ans=0;
heap_clear();
heap_push(1,0);
while (!heap_empty()){
int x=id[1];
double nowdis=now[1];
heap_pop();
if (x==n){
if (nowdis>E)
return ans;
E-=nowdis;
ans++;
continue;
}
for (int i=yg.fst[x];i;i=yg.nxt[i]){
int y=yg.y[i];
heap_push(y,nowdis+yg.z[i]);
}
}
}
int main(){
scanf("%d%d%lf",&n,&m,&E);
g.clear(n),yg.clear(n);
for (int i=1;i<=m;i++){
int a,b;
double e;
scanf("%d%d%lf",&a,&b,&e);
yg.add(a,b,e);
g.add(b,a,e);
}
g.spfa(n);
printf("%d",solve());
return 0;
}

  

BZOJ1975 [Sdoi2010]魔法猪学院 k短路的更多相关文章

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

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

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

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

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

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

  4. bzoj1975: [Sdoi2010]魔法猪学院【k短路&A*算法】

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

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

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

  6. 【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院

    Description 找出1~k短路的长度.   Solution k短路的求解要用到A*算法 A*算法的启发式函数f(n)=g(n)+h(n) g(n)是状态空间中搜索到n所花的实际代价 h(n) ...

  7. BZOJ1975 SDOI2010魔法猪学院(启发式搜索+最短路+堆)

    对反图跑最短路求出每个点到终点的最短路径,令其为估价函数大力A*,第k次到达某个点即是找到了到达该点的非严格第k短路,因为估价函数总是不大于实际值.bzoj可能需要手写堆.正解是可持久化可并堆,至今是 ...

  8. BZOJ1975 [Sdoi2010]魔法猪学院

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  9. BZOJ1975[Sdoi2010]魔法猪学院——可持久化可并堆+最短路树

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

随机推荐

  1. Goland could not launch process: decoding dwarf section info at offset 0x0: too short 解决方案

    1 前言 Goland版本:2018.1.5 Go:1.11.2 此版本调试不了bug,而且有时会显示could not launch process: decoding dwarf section ...

  2. [MySQL]子语句的查询技巧

    一.统计group by语句的行数 group by语句中,如果包含字段统计函数(诸如:count(),sum()...),这种情况下统计函数只会作用于group by的字段,因此想拿到最终结果的行数 ...

  3. MYSQL连不上

    如果你想连接你的MySQL的时候发生这个错误: ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL serve ...

  4. 将文字数字转阿拉伯数字(Python)

    今天改进爬虫的时候有这样的需求,如果是文字的数字把他转化成数字存储. 然后百度了一下没什么能看的博客. 其实挺无奈的,搜出来的博客全是一样的代码,有的图都是COPY,尤指CSDN,博客质量大多很差.怀 ...

  5. Android中播放音乐的几种方式

    前言 前几天一直在研究RxJava2,也写了记录了几篇博客,但因为工作任务原因,需要研究音频相关的知识,暂时放下Rxjava,本文的demo中,MediaPalyer 部分使用RxJava编写一点逻辑 ...

  6. Confluence 6 CSS 编辑快速入门

    希望编辑空间的 CSS 样式表: 进入空间后,然后从边栏的底部选择 空间工具(Space tools) > 外观和感觉(Look and Feel) . 然后选择 样式表(Stylesheet) ...

  7. selenium之实现多窗口切换到自己想要的窗口

    #coding=utf-8 from selenium import webdriver import time from selenium.webdriver.support import expe ...

  8. MongoDB的简单操作

    一.简介 二.MongoDB基础知识 三.安装 四.基本数据类型 五.增删改查操作 六.可视化工具 七.pymongo 一.简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库 MongoD ...

  9. tensorflow(3):神经网络优化(ema,regularization)

    1.指数滑动平均 (ema) 描述滑动平均: with tf.control_dependencies([train_step,ema_op]) 将计算滑动平均与 训练过程绑在一起运行 train_o ...

  10. Android Studio 调用夜神模拟器

    操作系统:Windows 10 x64 IDE:Android Studio 3.3 夜神模拟器 首先,启动夜神模拟器.快捷键WIN + R打开运行窗口,输入cmd,启动cmd.exe. 使用cd命令 ...