题意:
n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果

Input:
输入包含单个测试用例。测试用例以两个整数n和m开头,分别不超过30000和150000。n是班上的孩子数,孩子数从1到n。snoopy和flymouse始终是1和n。然后按照m行,每一行依次包含三个整数a、b和c,这意味着孩子a相信孩子b永远不会比他得到更多的c糖果。
翻译成人话就是:n个点,m条边。以及m条单向边的信息。

Output:
只输出一行所需的最大差异。差分是有限的。(即输出dis[i])

思路 :
参考大佬:①https://blog.csdn.net/qq_21057881/article/details/50574215
②https://blog.csdn.net/h1021456873/article/details/66472713

  • 对应最短路模型,在松弛完最短路后则变为 d[v] <= d[u] + w ,转化为 d[v] - d[u] <= w,这个和上面的 B - A <= C 是相同的模式 , 因此建图的时候A和B连一条有向边 , 边权为C,以1为起点,n为终点跑一遍最短路即可
  • 班上有n个同学,现在有一些糖要分给他们,设第i个同学得到的糖为p[i],分糖必须满足条件:第i个同学要求第j个同学的糖不能超过自己k个,即p[j] - p[i] <= k,k >= 0。要求在满足这些条件的情况下,求出p[n] - p[1]的最大值。
  • 由p[j] - p[i] <= k可得p[j] <= p[i] + k
  • 在单源最短路径的算法中有一步是“若mindis[j] > mindis[i] + dis[i][j],则mindis[j] = mindis[i] + dis[i][j],这样就满足mindis[j] <= mindis[i] + dis[i][j]”。因此本题可以使用单源最短路径的算法来解决,对于“第i个同学要求第j个同学的糖不能超过自己k个,即p[j] - p[i] <= k,k >= 0”这个条件,建立一条边(i->j)=k,由于不含负权路径,因此建立完所有边之后以第1个同学为起点,采用Dijkstra+Heap求最短路径即可。除了Dijkstra也可以利用Spfa+Stack算法求解,但由于数据原因必须用Stack,如果用Queue则会超时。

自己交了第一发WA了,原因是开EDGE的数组时候这么写的

//const int maxn = 30000+50;
EDGE edge[3*maxn];

改成下面代码后AC

EDGE edge[150000+10];

md傻了,应该是5*maxn才对啊!!!

#pragma warning(disable:4996)
#include<iostream>
#include<string>
#include<cmath>
#include<ctype.h>
#include<memory.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<iomanip>
#include<set>
#include<list>
#include<vector>
#include<stack>
#include<queue>
#define ll long long int
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 30000+50;struct EDGE
{int v, w;int next;
};
EDGE edge[150000+10];//3*maxn为什么不行struct node
{int to, dis;node(int u, int d):to(u), dis(d) {}bool operator <(const node& p)const{return dis > p.dis;}
};int n, m;
int cnt = 0;
int head[maxn];
int dis[maxn];
int vis[maxn];void ini()
{cnt = 0;for (int i = 0; i <= n; i++){head[i] = -1;vis[i] = 0;dis[i] = INF;}
}void addedge(int u, int v, int w)
{edge[cnt].v = v;edge[cnt].w = w;edge[cnt].next = head[u];head[u] = cnt;;cnt++;
}void dijkstra(int s)
{priority_queue<node> q;q.push(node(s, 0));dis[s] = 0;while (!q.empty()){node now = q.top(); q.pop();int u = now.to;if (!vis[u]){vis[u] = 1;for (int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].v;int w = edge[i].w;if (!vis[v] && dis[v] > dis[u] + w){dis[v] = dis[u] + w;q.push(node(v, dis[v]));}}}}
}int main()
{cin >> n >> m;ini();for (int i = 0; i < m; i++){int u, v, w;scanf("%d%d%d", &u, &v, &w);addedge(u, v, w);}dijkstra(1);cout << dis[n] << endl;return 0;
}

* poj 3159 Candies 最短路 dijkstra堆优化相关推荐

  1. poj1511 InvitationCards 最短路 Dijkstra堆优化

    第一反应想到和 poj3268做法一样,先是从起点dj,然后将图反向,再次dj一次,求和即可.但是,数据O(n*n)过不去,所以需要使用dijkstra的堆优化! 淦,没用scanf结果超时了= = ...

  2. HDU ACM 3986 Harry Potter and the Final Battle(邻接表实现最短路dijkstra堆优化记录路径 + 枚举最短路上每条边)...

    http://acm.hdu.edu.cn/showproblem.php?pid=3986 题意: 从起点1 到 终点n,删除图中任意一条边求最短路的最坏情况. n  --表示有n个点 m --边数 ...

  3. dijkstra堆优化(multiset实现-大大减小代码量)

    例题: Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣 ...

  4. A - Age of Moyu HDU - 6386(Dijkstra+堆优化)

    要解决这道题,可以用dfs+bfs,但是我不会,所以我只会dijkstra算法: 要解决这道题必须明白迪杰斯特拉算法的核心思想,我是这样理解的: 我可以任意举例一个图: 比如这个图,那么求1-6的最短 ...

  5. dij算法堆优化_BZOJ 3040 最短路(road) 堆优化Dijkstra | 学步园

    题目大意:最短路. 思路:最短路. 贴一份比较高效的堆优化Dij模板吧. CODE: #include #include #include #include #define _MAX 1000010 ...

  6. AcWing 850. Dijkstra求最短路 II(堆优化dijkstra)

    题目链接 : 点击查看 题目描述 : 给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点, ...

  7. 寒假集训 最短路(I - Heavy Transportation)dijkstra+堆优化

    今天的集训学习了最短路dijkstra的堆优化,把时间复杂度从朴素版的O()降至了O(n*logn+m). 首先,先上一段朴素版的代码. void dijkstra() {dist[1] = 0;fo ...

  8. POJ 3159 Candies

    题意是给A和B发糖果,B的糖果数 – A的糖果数 <= c, 也就是B <= A + c,最后求n比1最多多 几个糖果.题目只有这一个约束条件,建图不难.将AB看成有向图的边,然后c看成边 ...

  9. * Dijkstra 堆优化

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Mashiro_ylb/article/ ...

最新文章

  1. 一文了解什么是指数族分布
  2. 荆门 php,荆门php培训
  3. IA-32 Intel手册学习笔记(三)任务切换
  4. 艾为数字ic面试题_每日学习:数字后端面试100问(2019全新版)
  5. Linux 命令之 xz -- POSIX 平台的具有高压缩率的压缩工具
  6. Linux学习总结(54)——Red Hat Enterprise Linux与CentOS的区别
  7. LeetCode(1030)——距离顺序排列矩阵单元格(JavaScript)
  8. MySQL,优化查询的方法
  9. [教程] 康盛创想 Windows (server 2003) 服务器部署标准 白丁简明版
  10. matlab qpsk实验,MATLAB-QPSK调制与解调
  11. C语言将字符串转换为数字
  12. Win10应用商店下载应用速度非常缓慢的原因和解决方法
  13. 手机QQ邮箱可以发html邮件么,如何使用手机qq邮箱发送邮件
  14. 推特自动发帖,快速提升人气
  15. 一步步教你批量压缩打包文件夹
  16. 让最好用的印象笔记更好用
  17. 二十四节气-白露 | 白露至,秋实美
  18. 决定网站打开速度的是服务器内存还是带宽,决定数据中心服务器速度的七个要素...
  19. 积极主动的态度到底有多重要?
  20. 精选100个Python实战项目案例,送给缺乏实战经验的你

热门文章

  1. 草丛三剑客之逆向生成
  2. string常用函数用法集合
  3. 简单粗暴地理解js原型链--js面向对象编程
  4. HDU2159 FATE(二维背包、带限制条件的背包问题)
  5. 12.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
  6. 2016级算法第六次上机-D.AlvinZH的学霸养成记V
  7. Python -- 数据加载、存储与文件格式
  8. 用Visual Studio实践敏捷测试(二)上
  9. 给 TComboBox 添加图标 - 回复 heyongan 的问题
  10. RTT时钟管理篇——阻塞延时和时基更新函数