poj 3159 Candies (dij + heap)
明明找的是差分约束,然后就找到这题不知道为什么是求1~n的最短路的题了。然后自己无聊写了一个heap,518ms通过。
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int N = ;
const int M = ;
struct Edge {
int t, nx, c;
} edge[M];
int eh[N], ec; void init() {
memset(eh, -, sizeof(eh));
ec = ;
} void addedge(int s, int t, int c) {
edge[ec].t = t, edge[ec].nx = eh[s], edge[ec].c = c;
eh[s] = ec++;
} struct Heap {
int val[N], pos[N], id[N], sz, tmp, d;
void init() {
sz = ;
memset(pos, -, sizeof(pos));
}
int up(int t) {
while (t > && val[t] < val[t >> ]) pos[id[t] = id[t >> ]] = t, swap(val[t], val[t >> ]), t >>= ;
return t;
}
void push(int i, int v) {
val[++sz] = v;
pos[i] = up(sz);
id[pos[i]] = i;
}
void down(int tmp) {
while ((tmp << ) <= sz) {
if (val[tmp] <= val[tmp << ] && val[tmp] <= val[tmp << | ]) break;
if ((tmp << == sz) || val[tmp << ] <= val[tmp << | ]) {
d = tmp << ;
swap(pos[id[tmp]], pos[id[d]]);
swap(id[tmp], id[d]);
swap(val[tmp], val[d]);
tmp = d;
} else {
d = tmp << | ;
swap(pos[id[tmp]], pos[id[d]]);
swap(id[tmp], id[d]);
swap(val[tmp], val[d]);
tmp = d;
}
}
}
void modify(int i, int v) {
val[pos[i]] = v;
down(pos[i]);
pos[i] = up(pos[i]);
id[pos[i]] = i;
}
void pop(int &i) {
if (sz == ) {
i = -;
return ;
}
i = id[];
pos[i] = -;
if (sz == ) { sz--; return ;}
val[] = val[sz];
id[] = id[sz];
pos[id[]] = ;
sz--;
if (sz > ) down();
}
int gv(int i) { return ~pos[i] ? val[pos[i]] : -;}
} hp;
int dis[N]; int dij(int s, int t) {
int cur, i;
hp.init();
memset(dis, , sizeof(dis));
dis[s] = ;
hp.push(s, );
while (hp.sz) {
hp.pop(cur);
if (cur == t) return dis[cur];
for (i = eh[cur]; ~i; i = edge[i].nx) {
Edge &e = edge[i];
if (dis[e.t] > dis[cur] + e.c) {
dis[e.t] = dis[cur] + e.c;
if (~hp.gv(e.t)) hp.modify(e.t, dis[e.t]);
else hp.push(e.t, dis[e.t]);
}
}
}
return -;
} int main() {
int x, y, v;
int n, m;
while (~scanf("%d%d", &n, &m)) {
init();
while (m--) {
scanf("%d%d%d", &x, &y, &v);
addedge(x, y, v);
}
printf("%d\n", dij(, n));
}
return ;
}
——written by Lyon
poj 3159 Candies (dij + heap)的更多相关文章
- POJ 3159 Candies (图论,差分约束系统,最短路)
POJ 3159 Candies (图论,差分约束系统,最短路) Description During the kindergarten days, flymouse was the monitor ...
- POJ 3159 Candies 差分约束dij
分析:设每个人的糖果数量是a[i] 最终就是求a[n]-a[1]的最大值 然后给出m个关系 u,v,c 表示a[u]+c>=a[v] 就是a[v]-a[u]<=c 所以对于这种情况,按照u ...
- poj 3159 Candies(dijstra优化非vector写法)
题目链接:http://poj.org/problem?id=3159 题意:给n个人派糖果,给出m组数据,每组数据包含A,B,c 三个数,意思是A的糖果数比B少的个数不多于c,即B的糖果数 - A的 ...
- POJ 3159 Candies(SPFA+栈)差分约束
题目链接:http://poj.org/problem?id=3159 题意:给出m给 x 与y的关系.当中y的糖数不能比x的多c个.即y-x <= c 最后求fly[n]最多能比so[1] ...
- POJ 3159 Candies(差分约束,最短路)
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 20067 Accepted: 5293 Descrip ...
- POJ 3159 Candies(差分约束)
http://poj.org/problem?id=3159 题意:有向图,第一行n是点数,m是边数,每一行有三个数,前两个是有向边的起点与终点,最后一个是权值,求从1到n的最短路径. 思路:这个题让 ...
- POJ 3159 Candies 解题报告(差分约束 Dijkstra+优先队列 SPFA+栈)
原题地址:http://poj.org/problem?id=3159 题意大概是班长发糖果,班里面有不良风气,A希望B的糖果不比自己多C个.班长要满足小朋友的需求,而且要让自己的糖果比snoopy的 ...
- POJ 3159 Candies(差分约束+spfa+链式前向星)
题目链接:http://poj.org/problem?id=3159 题目大意:给n个人派糖果,给出m组数据,每组数据包含A,B,C三个数,意思是A的糖果数比B少的个数不多于C,即B的糖果数 - A ...
- Invitation Cards POJ 1511 SPFA || dij + heap
http://poj.org/problem?id=1511 求解从1去其他顶点的最短距离之和. 加上其他顶点到1的最短距离之和. 边是单向的. 第一种很容易,直接一个最短路, 然后第二个,需要把边反 ...
随机推荐
- HTML:如何将网页分为上下两个部分
1.使用table: <table> <tr> <td height="80%"><jsp:include page=" ...
- GIT → 04:Git与代码托管平台
4.1 Git 与 GitHub比较 Git 是一个版本管理工具 , 只在本地使用的一个版本管理工具,其作用就是可以让你更好的管理你的程序,比如你原来提交过的内容,后面虽然修改过,但是通过git这个工 ...
- Mac OS 安装 独立的asio库
先安装boost,见前文,然后上官网下载不带boost的asio,版本为:asio-1.12.2 cd到下载的库目录,配置 ./configure --with-boost="boost的安 ...
- cocos2d::ui::TextField 调用setAttachWithIME和setDetachWithIME都无效
http://www.cocoachina.com/bbs/read.php? tid=178406 看三楼: static_cast<CCTextFieldTTF*>(textField ...
- 提升mysql服务器性能(复制原理与拓扑优化)
原文:提升mysql服务器性能(复制原理与拓扑优化) 版权声明:皆为本人原创,复制必究 https://blog.csdn.net/m493096871/article/details/9008171 ...
- 洛谷P1311 [NOIP2011提高组Day1T2]选择客栈
P1311 选择客栈 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一 ...
- 【模板】tyvjP1520 树的直径 [2017年5月计划 清北学堂51精英班Day3]
P1520 树的直径 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 树的直径,即这棵树中距离最远的两个结点的距离.每两个相邻的结点的距离为1,即父亲结点与儿 ...
- OpenLayers添加和删除控件
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 关于sublime text2的一些问题(为解决)
1. 编写markdown文件后,如何转成pdf ? 2. 执行程序时,如何在控制台输入数据?
- jQuery事件大全(真的很全)
DOM Attribute $("p").addClass(css中定义的样式类型); 给某个元素添加样式$("img").attr({src:"te ...