当前位置: 首页 > news >正文

POJ3159 Candies(最短路径:SPFA+链表+栈)

题意:

有n个同学分糖,给m组数据i,j,k,要求第j个同学分到的糖不能比第i个同学分到的糖多于k个。要求第1个同学与第n个同学之间糖的个数差距最大,求最大的差距。

要点:

这题思路不难,既然要求1~n的差距最大,那每组数据刚好取k,整个就是一个最短路问题,dis数组存储的就是最多拿到的糖。但这题时间卡的实在是太紧,SPFA用STL都会超时,而且数据太大,必须要用邻接表存储边。所以看了一下网上大神的代码,用一个栈来维护原本的队列,然后用链表来存储同一个起点的所有边,这样可以到450ms,这题也说明了SPFA算法的时间不稳定。还可以用dijstra+heap做。


15391447Seasonal3159Accepted1960K454MSC++1078B2016-04-14 16:43:44
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INF 0x3f3f3f3f

struct edge
{
	int v, len;
	int next;
}e[150005];
int dis[30005],adj[30005];
bool vis[30005];
int n, m,tot;//tot为总边数

void add_edge(int u, int v, int len)//增加同一个起点的边数,链表存储
{
	e[tot].v = v;
	e[tot].len = len;
	e[tot].next = adj[u];//如果只有一条边就是-1
	adj[u] = tot++;		//adj用来指向下一个终点对应的下标
}

void spfa()
{
	memset(dis, INF, sizeof(dis));
	memset(vis, true, sizeof(vis));
	int stack[30005];
	int top = 0;
	stack[++top] = 1;
	vis[1] = false;
	dis[1] = 0;
	while (top)
	{
		int u = stack[top--];	//stack堆栈用来存储起点
		vis[u] = true;
		for (int i = adj[u]; i != -1; i = e[i].next)//遍历同一个起点的所有终点
		{
			int v = e[i].v;
			int len = e[i].len;
			if (dis[v] > dis[u] + len)
			{
				dis[v] = dis[u] + len;
				if (vis[v])
				{
					stack[++top] = v;
					vis[v] = false;
				}
			}
		}
	}
	
}

int main()
{
	int u, v, len;
	scanf("%d%d", &n, &m);
	for (int i = 0; i <= n; i++)
		adj[i] = -1;
	tot = 0;
	while(m--)
	{
		scanf("%d%d%d", &u,&v,&len);
		add_edge(u, v, len);
	}
	spfa();
	printf("%d\n", dis[n]);
	return 0;
}


转载于:https://www.cnblogs.com/seasonal/p/10343780.html

相关文章:

  • 【烈日炎炎战后端】SpringMVC(0.5万字)
  • 【shell 脚本】两种登录方式
  • 【烈日炎炎战后端】Spring(2.1万字)
  • tcpdump统计http请求
  • 产品经理技能之MRD的笔记之一
  • 【烈日炎炎战后端】消息队列(1.0万字)
  • css笔记:如何让一个div居于页面正中间
  • 【烈日炎炎战后端】Git(0.1万字)
  • R语言 如何为图片添加文字说明(转载)
  • 【烈日炎炎战后端 】MyBatis(0.4万字)
  • Windows Docker的有趣事实
  • RSD和wlwmanifest是什么
  • 【烈日炎炎战后端】Zookeeper(0.5万字)
  • iOS 中runtime的运用原理
  • 【烈日炎炎战后端】Elecsticsearch(1.5万字)
  • 2017-09-12 前端日报
  • Cumulo 的 ClojureScript 模块已经成型
  • C学习-枚举(九)
  • HTTP中GET与POST的区别 99%的错误认识
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JSONP原理
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • orm2 中文文档 3.1 模型属性
  • Redux 中间件分析
  • Sass 快速入门教程
  • SQLServer之创建显式事务
  • Web标准制定过程
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 初识MongoDB分片
  • 对超线程几个不同角度的解释
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 解析带emoji和链接的聊天系统消息
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 入手阿里云新服务器的部署NODE
  • 移动端 h5开发相关内容总结(三)
  • 译米田引理
  • 云大使推广中的常见热门问题
  • 阿里云ACE认证之理解CDN技术
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • # centos7下FFmpeg环境部署记录
  • #QT(智能家居界面-界面切换)
  • (14)Hive调优——合并小文件
  • (145)光线追踪距离场柔和阴影
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转) ns2/nam与nam实现相关的文件
  • (转)【Hibernate总结系列】使用举例
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net 反编译_.net反编译的相关问题
  • .NET 中使用 Mutex 进行跨越进程边界的同步