洛谷p2483 模板k短路 可持久化可并堆
时间:2019-11-03
本文章向大家介绍洛谷p2483 模板k短路 可持久化可并堆,主要包括洛谷p2483 模板k短路 可持久化可并堆使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
直接上代码?
#include<bits/stdc++.h> #define eps 1e-8 using namespace std; int head[10005],cnt=-1,v[10005],rt[10005],mark[1000005],ans,fa[10005]; int n,m,tot; double se,dis[10100]; priority_queue<pair<double,int > >q;//这里注意,是double ,int struct Heap{ int ls,rs,dist,to;//左儿子 右儿子 左偏树内点的dist,每个点对应边的终点 double w;//小根堆每个点的权值 }tr[30000010]; struct node{ int next,to; double w; }e[10000010]; void add(int from,int to,double w){ e[++cnt].next=head[from]; e[cnt].to=to; e[cnt].w=w; head[from]=cnt; } int merge(int x,int y){ if(!x||!y)return x+y; if(tr[x].w-tr[y].w>=eps)swap(x,y); int p=++tot; tr[p]=tr[x]; tr[p].rs=merge(tr[p].rs,y); if(tr[tr[p].ls].dist<tr[tr[p].rs].dist)swap(tr[p].ls,tr[p].rs); tr[p].dist=tr[tr[x].rs].dist+1; return p; } void dijkstra(){ memset(v,0,sizeof v); memset(dis,127,sizeof dis); dis[n]=0; q.push(make_pair(0,n)); while(!q.empty()){ int from=q.top().second; q.pop(); if(v[from])continue; v[from]=1; for(int i=head[from];~i;i=e[i].next){ if(i&1){//反向边 int to=e[i].to; if(dis[to]-(dis[from]+e[i].w)>eps){ dis[to]=dis[from]+e[i].w; q.push(make_pair(-dis[to],to)); } } } } }//djk跑一遍从终点反向往回走的最短路树 void dfs(int from){ v[from]=1; for(int i=head[from];i!=-1;i=e[i].next){ int to=e[i].to; if(i&1){ if(v[to])continue; if(fabs(dis[from]+e[i].w-dis[to])<eps){ fa[to]=from; mark[i^1]=1; dfs(to); } } } }//标记一下最短路树上有哪些边 int newnode(double w,int to){ int x=++tot; tr[x].w=w; tr[x].dist=1; tr[x].to=to; return x; } int main(){ memset(head,-1,sizeof head); scanf("%d%d%lf",&n,&m,&se); for(int i=1;i<=m;i++){ int x,y; double z; scanf("%d%d%lf",&x,&y,&z); add(x,y,z); add(y,x,z); } dijkstra(); memset(v,0,sizeof v); dfs(n); for(int i=0;i<=cnt;i+=2){ if(!mark[i]){ int from=e[i^1].to,to=e[i].to; if(dis[from]==dis[0]||dis[to]==dis[0])continue; rt[from]=merge(rt[from],newnode(dis[to]+e[i].w-dis[from],to)); } }//把不在最短路树上的路径加入堆; //权值是"走不在最短路树上的边的路径长度与最短路的路径长度的差值" for(int i=1;i<=n;i++){ q.push(make_pair(-dis[i],i)); } for(int i=1;i<=n;i++){ int from=q.top().second; q.pop(); if(fa[from])rt[from]=merge(rt[from],rt[fa[from]]); }//把在最短路树上的路径加入堆 if(dis[1]-se<eps)se-=dis[1],ans++; //走最短路的情况 if(rt[1])q.push(make_pair(-tr[rt[1]].w,rt[1]));//假如rt[1]没有说明从n根本到不了1 while(!q.empty()){ int from=q.top().second; double cur=q.top().first; double w=dis[1]-cur;//当前路径的长度 if(w-se>=eps)break;//能量耗完 q.pop(); se-=w; ans++;//找到一条k路径 for(int i=0;i<2;i++){//加当前的堆的路径 int to=i?tr[from].rs:tr[from].ls; if(to)q.push(make_pair(cur+tr[from].w-tr[to].w,to));//一条新的路径 加入优先队列 }//把左儿子和右儿子加入优先队列,因为是小根堆 ,所以这样加肯定是从小到大的; if(rt[tr[from].to])q.push(make_pair(cur-tr[rt[tr[from].to]].w,rt[tr[from].to])); //加to对应的新的堆的路径; } printf("%d\n",ans); }
原文地址:https://www.cnblogs.com/passione-123456/p/11788117.html
- Golang语言 xml解析实例
- 机器学习算法实现解析——libFM之libFM的模型处理部分
- Go语言使用protobuf数据通信--师出同门,懂的人理解吧
- 虚拟化平台cloudstack(6)——使用maven:jetty调试
- 虚拟化平台cloudstack(7)——新版本的调试
- 一行代码,Pandas秒变分布式,快速处理TB级数据
- 机器学习算法实现解析——word2vec源码解析
- 从零开始创建一个基于Go语言的web service
- 转--Golang项目邮件发送模块代码分享
- 虚拟化平台cloudstack(8)——从UI开始
- 使用oracle的大数据工具ODCH访问HDFS数据文件
- UWP基础教程 - XAML开篇
- UWP基础教程 - XAML依赖属性和附加属性
- GO语言学习:动态Web
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [即时通信IM]群@消息如何实现?
- 利用PySpark对 Tweets 流数据进行情感分析实战
- ConcurrentHashMap源码学习
- HashMap源码学习
- Pytest自动化测试fixture之conftest.py
- ArrayList源码学习
- 科技将带给我们什么变化?讲述基于 HTML5 WebGL 的 3D 科幻风机
- OOP面向对象编程(Object-Oriented Programming)概述
- arm(3)| 点亮led灯
- 根据 PID 获取容器所在的 Pod 名称
- Python 爬虫进阶必备 | 关于某服务平台数据解密流程分析
- batch-compute & GPU分布式机器学习
- 数据源管理 | 搜索引擎框架,ElasticSearch集群模式
- PHP的CLI命令行运行模式浅析
- 基于Pytorch构建三值化网络TWN