BZOJ1975 [Sdoi2010]魔法猪学院 k短路
欢迎访问~原文出处——博客园-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短路的更多相关文章
- [BZOJ1975][SDOI2010]魔法猪学院(k短路,A*)
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2748 Solved: 883[Submit][Statu ...
- bzoj 1975: [Sdoi2010]魔法猪学院 [k短路]
1975: [Sdoi2010]魔法猪学院 裸题... 被double坑死了 #include <iostream> #include <cstdio> #include &l ...
- BZOJ 1975: [Sdoi2010]魔法猪学院——K短路,A*
传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1975 题意&简要做法 一张有向图,求出最多的互不相同的路径,满足路径长度之和\(\l ...
- bzoj1975: [Sdoi2010]魔法猪学院【k短路&A*算法】
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2446 Solved: 770[Submit][Statu ...
- BZOJ-1975 魔法猪学院 K短路 (A*+SPFA)
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1323 Solved: 433 [Submit][Statu ...
- 【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院
Description 找出1~k短路的长度. Solution k短路的求解要用到A*算法 A*算法的启发式函数f(n)=g(n)+h(n) g(n)是状态空间中搜索到n所花的实际代价 h(n) ...
- BZOJ1975 SDOI2010魔法猪学院(启发式搜索+最短路+堆)
对反图跑最短路求出每个点到终点的最短路径,令其为估价函数大力A*,第k次到达某个点即是找到了到达该点的非严格第k短路,因为估价函数总是不大于实际值.bzoj可能需要手写堆.正解是可持久化可并堆,至今是 ...
- BZOJ1975 [Sdoi2010]魔法猪学院
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ1975[Sdoi2010]魔法猪学院——可持久化可并堆+最短路树
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
随机推荐
- mysql生成数据字典
git clone https://github.com/twindb/undrop-for-innodb.git make [root@redis01 undrop-for-innodb]# mak ...
- Winform按键捕获
参考:http://blog.csdn.net/zhensoft163/article/details/4239796 下载链接 方法1:使用窗体的 KeyDown 事件 private void F ...
- appium+java(四)微信公众号自动化测试实践
前言 随着手机阅读的普遍应用,微信公众号阅读,更为普遍,微信和qq一样,都是基于腾讯自研X5内核,不是google原生webview(其实就是进行了二次定制).实质上也是混合应用的一种,现在很多app ...
- 异步io模块
'''客户端''' import socket,select #####进行封装,将socket对象和要返回的url,和回调函数进行一下封装 class Httprequest(): def __in ...
- 14)django-模板(计数器)
模块中for循环自带计数器. 使用场景:表格数据相增加序列号. 问:可以使用表的自增加序列做为序列号,但是这个存在个问题,即表中数据被删除,则会出现序列不连续. 1)每个循环都有6个公共方法,双循环有 ...
- FTP服务器配置和管理
一:ftp 简介 1:ftp服务: internet 是一个非常复杂额计算机环境,其中有pc/mac/小型机/大型机等.而在这些计算机上运行的操作系统也是五花八门,有 unix.Linux.微软的wi ...
- Confluence 6 € 欧元字符集不能正常显示
€ (euro) 标记 是一个 3 字节字符,在 (UTF-8)中这个字符被表示为 0xE2, 0x82, 0xAC. 有时候,你的系统中没有设置所有的地方为相同的字符集的时候(Confluence, ...
- LeetCode(99):恢复二叉搜索树
Hard! 题目描述: 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ 2 输出 ...
- react 为组件添加样式
width/height/fontSize:可以直接写数字: style={ width:200,height:200 } 其他带数字的可以:数字+'px' style={ lineHeight:20 ...
- python(3):文件操作/os库
文件基本操作 r,以读模式打开, r+=r+w, w, 写模式(清空原来的内容), w+=w+r, a , 追加模式, a+=a+r, rb, wb, ab, b表示以二进制文件打开 想在一段文 ...