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

相关文章

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规

Redis KEYS查询大批量数据替代方案

《RedisKEYS查询大批量数据替代方案》在使用Redis时,KEYS命令虽然简单直接,但其全表扫描的特性在处理大规模数据时会导致性能问题,甚至可能阻塞Redis服务,本文将介绍SCAN命令、有序... 目录前言KEYS命令问题背景替代方案1.使用 SCAN 命令2. 使用有序集合(Sorted Set)

SpringBoot整合Canal+RabbitMQ监听数据变更详解

《SpringBoot整合Canal+RabbitMQ监听数据变更详解》在现代分布式系统中,实时获取数据库的变更信息是一个常见的需求,本文将介绍SpringBoot如何通过整合Canal和Rabbit... 目录需求步骤环境搭建整合SpringBoot与Canal实现客户端Canal整合RabbitMQSp

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Nacos集群数据同步方式

《Nacos集群数据同步方式》文章主要介绍了Nacos集群中服务注册信息的同步机制,涉及到负责节点和非负责节点之间的数据同步过程,以及DistroProtocol协议在同步中的应用... 目录引言负责节点(发起同步)DistroProtocolDistroSyncChangeTask获取同步数据getDis

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行