Heat Wave(热浪)附超大数据

2024-02-05 10:58
文章标签 数据 wave 超大 热浪 heat

本文主要是介绍Heat Wave(热浪)附超大数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Heat Wave(热浪)

来源:USACO2009 October

题目描述

The good folks in Texas are having a heatwave this summer. Their Texas Longhorn cows make for good eating but are not so adept at creating creamy delicious dairy products. Farmer John is leading the charge to deliver plenty of ice cold nutritious milk to Texas so the Texans will not suffer the heat too much.

FJ has studied the routes that can be used to move milk from Wisconsin to Texas. These routes have a total of T (1 <= T <= 2,500) towns conveniently numbered 1..T along the way (including the starting and ending towns). Each town (except the source and destination towns) is connected to at least two other towns by bidirectional roads that have some cost of traversal (owing to gasoline consumption, tolls, etc.). Consider this map of seven towns; town 5 is the

source of the milk and town 4 is its destination (bracketed integers represent costs to traverse the route):
这里写图片描述(From:Luogu.org)
Traversing 5-6-3-4 requires spending 3 (5->6) + 4 (6->3) + 3 (3->4) = 10 total expenses.

Given a map of all the C (1 <= C <= 6,200) connections (described as two endpoints R1i and R2i (1 <= R1i <= T; 1 <= R2i <= T) and costs (1 <= Ci <= 1,000), find the smallest total expense to traverse from the starting town Ts (1 <= Ts <= T) to the destination town Te (1 <= Te <= T).

德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品。Farmer John此时以先天下之忧而忧,后天下之乐而乐的精神,身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦。

FJ已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线。这些路线包括起始点和终点先一共经过T (1 <= T <= 2,500)个城镇,方便地标号為1到T。除了起点和终点外地每个城镇由两条双向道路连向至少两个其它地城镇。每条道路有一个通过费用(包括油费,过路费等等)。

给定一个地图,包含C (1 <= C <= 6,200)条直接连接2个城镇的道路。每条道路由道路的起点Rs,终点Re (1 <= Rs <= T; 1 <= Re <= T),和花费(1 <= Ci <= 1,000)组成。求从起始的城镇Ts (1 <= Ts <= T)到终点的城镇Te(1 <= Te <= T)最小的总费用。
输入输出格式
输入格式:

第一行: 4个由空格隔开的整数: T, C, Ts, Te

第2到第C+1行: 第i+1行描述第i条道路。有3个由空格隔开的整数: Rs, Re和Ci

输出格式:

一个单独的整数表示从Ts到Te的最小总费用。数据保证至少存在一条道路。
输入输出样例
输入样例#1:

7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1

输出样例#1:

7
输入样例#2:

超大数据,上面的账号是我的Luogu账号,欢迎关注

输出样例#2:

1159

绪言

今天借USACO上的这个题学习一下SPFA,捎带着复习一下链表(如果有不理解链表的请移步来自Stockholm的链表入门,那里有非常详尽的解释)
然后就是这个超大的数据,本人欲从洛谷上下载而不得(文件太大,不允许下载),所以就找了一个以前的。

思路

这个题要用到SPFA,所谓SPFA的来历啥的就不再絮叨了,想知道的移步百度百科,关于SPFA入门在接下来会有一篇文章专门聊这件事情(望顶)。
这个题算是一个SPFA或者dijikstra算法的模板题,是一个裸的单源最短路问题,存起来最好要用链表。

数据处理

值得注意的是,在开结构体数组的时候,要开到6201*2的位置,因为这个题的每一条路都是双向路。处理如下:

        for(i=1;i<=m;i++){x=r(),y=r(),w=r();//这里的r()是读入优化a[gs[x]].nxt=&a[i*2-1];//下一个的指针a[gs[y]].nxt=&a[i*2];gs[x]=i*2-1;//gs[x]用来记录最后一条从x出发的路//不过现在看来好像没啥用。。。gs[y]=i*2;if(!s[x]) s[x]=i*2-1;//s[x]是用来记录第一条从x出发的路,这个//还是有用的。if(!s[y]) s[y]=i*2;a[i*2-1].d=y,a[i*2-1].v=w;a[i*2].d=x,a[i*2].v=w;}
其他初始化步骤

这道题我是用了SPFA。
我们还需要一个queue来存节点,所以先把start点push进去。需要一个数组存从start点到某点的最短路程len[]。
初始化使len[start]=0,数组内其余元素=∞。

SPFA

其余的就是SPFA的相关技巧了,在此不再赘述。
在这里上我的SPFA代码

void spfa(int xx)
{struct data *p=&a[s[xx]];while(!q.empty()){p=&a[s[q.front()]];xx=q.front();q.pop();while(p!=NULL){if(len[p->d]>p->v+len[xx]){q.push(p->d);len[p->d]=p->v+len[xx];}p=p->nxt;}}
}

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
queue<int> q;
int f[4000];
struct edge
{int to,dis;edge* next=NULL;
}head[4001];
void add(int from,int to,int dis)
{edge* p;p=new edge;p->to=to,p->dis=dis;p->next=head[from].next;head[from].next=p;
} 
int read()
{int f=1,p=0;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}return f*p;
}
int n,m,a,b;
int spfa(int i)
{edge* p;memset(f,0x7f,sizeof(f));q.push(i);f[i]=0;while(!q.empty()){i=q.front();p=&head[i];q.pop();for(;p!=NULL;p=p->next){if(f[p->to]>f[i]+p->dis){q.push(p->to);f[p->to]=f[i]+p->dis;}}}
}
int main()
{freopen("in.txt","r",stdin);n=read(),m=read();a=read(),b=read();for(int u,v,e,i=1;i<=m;i++){u=read(),v=read(),e=read();add(u,v,e),add(v,u,e);}spfa(a);printf("%d",f[b]);return 0;
}

结束语

接下来就是SPFA的入门讲解,希望滋糍。

这篇关于Heat Wave(热浪)附超大数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680692

相关文章

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本