3424:Candies(差分约束,Dijkstra)(配对堆优化
题解
令x-y<=z表示x最大比y大z。
若b-a<=k1, c-b<=k2, c-a<=k3,那么c-a最大为多少呢?显然应该等于min(k1+k2, k3)。可以用下图来表示示(不擅图丑勿怪)

C++堆优化代码
//链式前向星存图+迪杰斯特拉堆优化
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int MAX=;
const int MAXN=;
const int INF=0x3f3f3f3f;
int head[MAX],cnt=;
int t,n,a,b,len;
int dist[MAX];
bool vis[MAX];
struct Edge{ //链式前向星
int next,val,to;
}Edge[MAXN];
inline void add(int u,int v,int w)
{
Edge[cnt].to=v;
Edge[cnt].val=w;
Edge[cnt].next=head[u];
head[u]=cnt++;
}
struct node
{
int pos,dist; //点的位置及距离
node(){}
node(int p,int d)
{
pos=p;
dist=d;
}
bool operator < (const node &rhs)const //重载 <
{
return dist>rhs.dist;
}
};
void Dij(int start)
{
priority_queue<node>que;
for(int i=;i<=t;i++)
{
dist[i]=INF;
vis[i]=false;
}
dist[start]=;
que.push(node(start,)); while(!que.empty())
{
node temp=que.top(); //优先队列为首的元素及dist数组的最小值
que.pop();
int v=temp.pos; //筛选出最小值
if(vis[v])continue; //判断是否已经找到最小值 ,是的话跳过
vis[v]=true; for(int i=head[v];i!=-;i=Edge[i].next) //用最小值的点为弧尾的边更新距离
{
int to=Edge[i].to;
if(dist[to]>dist[v]+Edge[i].val)
{
dist[to]=dist[v]+Edge[i].val;
que.push(node(to,dist[to]));
}
}
}
}
int main()
{
while(scanf("%d%d",&t,&n)!=EOF)
{
memset(head,-,sizeof(head));
for(int i=;i<n;i++)
{
scanf("%d%d%d",&a,&b,&len);
add(a,b,len);
//add(b,a,len);
}
Dij();
printf("%d\n",dist[t]);
}
return ;
}
C++配对堆优化
#include <bits/stdc++.h>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef pair<int,int> pii;
typedef __gnu_pbds::priority_queue<pii,greater<pii>,pairing_heap_tag> Heap;
const int maxn=1e5+;
const int INF=0x3f3f3f3f; int n,m,s;
struct Edge{
int u,v,w;
Edge(int _u=,int _v=,int _w=){u=_u,v=_v,w=_w;}
};
vector<Edge> E;
vector<int> G[maxn];
void addedge(int u,int v,int w)
{
E.push_back(Edge(u,v,w));
G[u].push_back(E.size()-);
} int d[maxn];
void dijkstra()
{
memset(d,0x3f,sizeof(d)); Heap Q;
Heap::point_iterator id[maxn]; d[s]=;
id[s]=Q.push(make_pair(d[s],s));
while(!Q.empty())
{
int u=Q.top().second; Q.pop();
for(int i=;i<G[u].size();i++)
{
Edge &e=E[G[u][i]]; int v=e.v;
if(d[v]>d[u]+e.w)
{
d[v]=d[u]+e.w;
if(id[v]!=) Q.modify(id[v],make_pair(d[v],v));
else id[v]=Q.push(make_pair(d[v],v));
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m)){
s = ;//起点
//memset(d,0,sizeof d);
memset(G,,sizeof G);
for(int i=;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
dijkstra();
//for(int i=1;i<=n;i++) printf("%d%s",d[i],((i==n)?"\n":" "));
printf("%d\n",d[n]);
}
}
3424:Candies(差分约束,Dijkstra)(配对堆优化的更多相关文章
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- 配对堆优化Dijkstra算法小记
关于配对堆的一些小姿势: 1.配对堆是一颗多叉树. 2.包含优先队列的所有功能,可用于优化Dijkstra算法. 3.属于可并堆,因此对于集合合并维护最值的问题很实用. 4.速度快于一般的堆结构(左偏 ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- POJ 3159 Candies 解题报告(差分约束 Dijkstra+优先队列 SPFA+栈)
原题地址:http://poj.org/problem?id=3159 题意大概是班长发糖果,班里面有不良风气,A希望B的糖果不比自己多C个.班长要满足小朋友的需求,而且要让自己的糖果比snoopy的 ...
- POJ 3159 Candies 【差分约束+Dijkstra】
<题目链接> 题目大意: 给n个人派糖果,给出m组数据,每组数据包含A,B,c 三个数,意思是A的糖果数比B少的个数不多于c,即B的糖果数 - A的糖果数<= c .最后求n 比 1 ...
- POJ-3159(差分约束+Dijikstra算法+Vector优化+向前星优化+java快速输入输出)
Candies POJ-3159 这里是图论的一个应用,也就是差分约束.通过差分约束变换出一个图,再使用Dijikstra算法的链表优化形式而不是vector形式(否则超时). #include< ...
- 【最短路Dijistra】【一般堆优化】【配对堆优化】
突然觉得堆优化$O(log_n)$的复杂度很优啊,然而第n次忘记了$Dijistra$怎么写QAQ发现之前都是用的手写堆,这次用一下$stl$ #include<bits/stdc++.h> ...
- poj3159 Candies(差分约束,dij+heap)
poj3159 Candies 这题实质为裸的差分约束. 先看最短路模型:若d[v] >= d[u] + w, 则连边u->v,之后就变成了d[v] <= d[u] + w , 即d ...
- [poj 3159]Candies[差分约束详解][朴素的考虑法]
题意 编号为 1..N 的人, 每人有一个数; 需要满足 dj - di <= c 求1号的数与N号的数的最大差值.(略坑: 1 一定要比 N 大的...difference...不是" ...
随机推荐
- javaScrpit插件学习制作
最近一直在学习javaScrpit插件制作,前几天学习制作了一个插件但存在严重缺陷. javaScrpit插件写法多种多样通过这几天的学习终于找到了适合自己的方法.前几天的缺陷也得到了解决.下面我们用 ...
- yum安装Docker
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- NP-Hard问题和NP-Complete问题
对 NP-Hard问题和NP-Complete问题的一个直观的理解就是指那些很难(很可能是不可能)找到多项式时间算法的问题.因此一般初学算法的人都会问这样一个问题:NP-Hard和NP-Complet ...
- 【Spark机器学习速成宝典】基础篇01Windows下spark开发环境搭建+sbt+idea(Scala版)
注意: spark用2.1.1 scala用2.11.11 材料准备 spark安装包 JDK 8 IDEA开发工具 scala 2.11.8 (注:spark2.1.0环境于scala2.11环境开 ...
- shiro 注解不生效
springboot集成shiro时,使用@RequiresRoles注解不生效. shiro @RequiresRoles底层使用springaop技术: 1.@RequiresRoles修饰ser ...
- js中var的重复声明
腾讯的一个笔试题,先看一下 var a = 100;function fn() { alert(a); //undefined var a = 200; alert(a); //200}fn();al ...
- PLSQL导出表的数据insert语句
“Where clause”可以设置查询条件.设置好文件导出的路径(“Output file”),点击[Export]按钮,就可以导出INSERT语句了. 导出之后使用nodepad打开: 但是如果我 ...
- vim技巧1
在编辑模式或可视模式下输入的命令会另外注明.1. 查找 /xxx(?xxx) 表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示 ...
- neutron网络服务
一.neutron 介绍: 1. Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需 ...
- Hibernate 持久化对象和一级缓存
关于如何手动创建Hibernate,Hibernate初了解已经介绍了,接下来了解持久化对象和一级缓存. Hibernate的持久化类有三种状态: 1.Transient瞬时态:持久化对象没有唯一标识 ...