哗啦啦村的扩建(DFS+链式前向星)

图论——链式前向星(个人认为比较易懂的理解方式) 目录链式前向星概括链式前向星范例链式前向星实现完整代码样例输入样例输出 链式前向星概括 以同起点为一条链,数组head[a]存储起点a的最新录入的一条边的索引,每条边以结构体的形式存储该边信息(该边终点,权值,同起点的边中的上一条边即上一次录入的边的位置),所有边构成一个结构体数组。 很多帖子说到的是存储的是下一条边,这种理解很容易给人误导,应该是每一条边都能通过自身结构体存储的信息回溯到上一条边,所以叫前向星。 假如我们要找出一条a -> b的边,先根据head[a]找出从起点a出发的所有边里最新录 阅读详情


Link:http://acdream.info/contest?cid=1374#problem-C


C - 哗啦啦村的扩建

Time Limit:  2000/1000MS (Java/Others)     Memory Limit:  512000/256000KB (Java/Others)
Problem Description

呀呀呀,哗啦啦村在日渐发展中,越来越大了。

唐老师看到这欣欣向荣的情景,感到非常开心。

狗哥在旁边,“喏,我们村子扩建这么快,肯定用了不少钱吧?”

唐老师说:“是呀,不过这些钱都不及我零花钱的万万分之一。”

 

那么这时候问题来了,唐老师的零花钱至少应该有多少钱呢?

狗哥也想知道这道题的答案,于是他拜托了青君同学,了解到了村子扩建的费用。

啊,原来村子的扩建费用,就是修建道路的费用。

整个村子可以看作有n个房子,村子会修建n-1条道路,保证从任意房子可以到达任意其他房子。

那修建这n-1条道路的费用怎么记呢?对于每条道路,假设这条道路左边有x个房子,右边有y个房子,这条道路长度为k,那么费用就是k*|x-y|。

 

那么唐老师的零花钱至少有多少钱呢?现在你应该知道了吧。

 

Input

第一行一个整数,表示这个村子有n个房子

接下来n-1行,表示每条道路的信息,三个整数 a,b,c,表示a,b之间有一条道路,这条路的长度为c

1<=n<=50,000

1≤ai, bi≤n

0 ≤ci≤ 10^6

Output
输出一个整数,表示唐老师的零花钱至少有多少钱
Sample Input
6
1 2 1
1 3 1
1 4 2
6 3 1
5 2 1 
Sample Output
2000000000


坑点:见代码注释部分。


AC  code:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#define MAXN 1000010
#define LL long long
using namespace std;
struct node{
	int v;
	int next;
	LL w;//只能用long long
}edge[MAXN];
int head[MAXN];
int fg[MAXN];
int cnt[MAXN];
int n,tot;
int dp[MAXN];
LL ans=0;
void add(int from,int to,int w)
{
	edge[tot].w=w;
	edge[tot].v=to;
	edge[tot].next=head[from];
	head[from]=tot++;
}

void dfs(int p)
{
	fg[p]=1;//因为无向图边是双向的,为避免重复走,走过的点必须做标记 
	for(int i=head[p];i!=0;i=edge[i].next)
	{
		int v=edge[i].v;
		if(fg[v]==1)// 走过的点
			continue;
		else
		{
			dfs(v);
			cnt[p]+=cnt[v];
        	edge[i].w=edge[i].w*abs(n-2*cnt[v]);
			ans+=edge[i].w;
		}		
	}
}
int main()
{
	int u,v,w;
	//freopen("D:\in.txt","r",stdin);
	while(scanf("%d",&n)!=EOF)
	{
	    for(int i=1;i<=n;i++)//注意:memset函数只能初始化数组为0或-1,
		{                   //初始化其他数只能用for循环 
			cnt[i]=1;
		}
        memset(head,0,sizeof(head));
        memset(fg,0,sizeof(fg));
        //memset(cnt,1,sizeof(cnt));
        //printf("%d\n",cnt[2]);
	    tot=1;
		int t=n-1;
		while(t--)
		{
			scanf("%d%d%d",&u,&v,&w);
			add(u,v,w);
			add(v,u,w);
		}	
		ans=0;	
		dfs(1);
	//	printf("%lld\n",ans*100000000);//不能这样写,会爆LL!
		if(ans!=0)
			printf("%lld00000000\n",ans);
		else
		{
			printf("0\n");
		}	
		
	}
	return 0;
}


C++中邻接矩阵、邻接表、链式前向星具体用法及讲解 邻接矩阵基本没用有边的数量就用链式前向星,否则就邻接表。 阅读详情

相关推荐

图的存储——链式前向星

前向星 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了 以下图为例构造前向星: len[i]记录所有以i为起点的边在数组中的存储长度 head[i]记录以i为起点的边集在数组中的第一个存储位置 利用前向星,我们可以O(len[i])的时间找到以i为起...

Happig的博客 608

链式前向星

链式前向星

MuShan_bit的博客 1万+

HFSS新手避坑指南:从零搭建T形波导功分器(含参数扫描与优化实战)

本文为HFSS新手提供T形波导功分器设计的详细指南,涵盖基础设置、建模技巧、参数扫描与优化实战。重点解析内场分析中的常见陷阱,如单位设置、波端口定义和布尔运算错误,并分享优化设计的关键步骤,帮助工程师快速掌握HFSS在微波器件设计中的应用。

weixin_27442001的博客 138

【数据结构】 链式前向星

图的存储方式主要有链接矩阵、邻接表两种,邻接矩阵的好处是写建图简单方便但占内存较大,节点数量稍微大点的题目就开不下数组了(适合稠密图);而邻接表虽然节省空间,但其指针形式难写易错,且vector形式的读取太慢易导致大数据下的TLE。针对上述问题,这里就产生了一种比较中庸的方式:链式前向星。简单来说,链式前向星就是把数据以链表形式连接在一起,那么连接的条件是什么呢?我们回想一下图里面邻接表里存的是每个点的连接点。那么这里的链式前向星存的就是以每个点为起点的所有边。

这里是阿安的博客 2853

Cartographer从安装到实战:手把手教你运行2D/3D建图与定位

本文提供了一份详尽的Cartographer从零安装到实战应用的完整指南。内容涵盖环境准备、依赖编译、源码构建等关键步骤,并手把手指导读者运行2D/3D官方数据集进行建图与定位测试。文章深入解析了参数配置与自定义数据适配方法,帮助开发者快速掌握这一强大的实时同步定位与建图工具,并将其应用于机器人导航与自动驾驶等实际场景。

rice5的博客 949

NFS服务器配置与autofs自动挂载

NFS服务器配置autofs自动挂载 环境: hostname ip OS server 192.168.220.138 centos7 client 192.168.220.139 centos7 一、NFS概述 NFS(Network File System)网络文件系统。最大功能就是通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。 二、端口 [root@se...

DoloresOOO的博客 1026

深度理解链式前向星

我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了. 用len[i]来记录所有以i为起点的边在数组中的存储长度. 用head[i]记录以i为边集在数组中的第一个存储位置. 那么对于下图:

ACdreamer 7万+

手把手教你用ADIsimCLK和GUI搞定HMC7044时钟配置(附避坑指南)

本文详细解析了HMC7044时钟芯片的配置方法,通过ADIsimCLK和HMC7044 Configuration GUI工具,从频率规划到硬件验证全流程实战演示。特别针对PLL模式选择、分频链配置等易错环节,提供量产验证的配置模板和实测数据,帮助工程师快速掌握高性能时钟解决方案。

weixin_30755393的博客 794

一篇文章帮你弄懂邻接矩阵,邻接表和链式前向星的区别

万字爆肝,十分钟带你了解邻接表,邻接矩阵,链式前向星的本质区别,图文并茂,适合小白(超超超详细!)

欢迎来到“曲终酣兴晚^R”的博客~ 5356

BMC的风扇控制 (Fan speed control)

这篇文章是我刚开始做风扇功能的时候写的,因为那时候都找不到主管要我报告的内容,所以报告完就顺便整理一下,最近因为在修控制学,之后应该会再补一篇和控制学相关的内容 (如果有空的话) BMC的风扇控制算一个蛮重要的功能,那这个功能包含了"TACH"和"PWM"这两个常用讯号怎么解读,还有最常用的控制演算法"PID(closed loop)"和"Stepwise(openloop)",而另外的Error control ,因为每家做法不同,就不会在这边作介绍 ##实作程式码是来自Facebook的openBM

yeiris的博客 1万+

开源项目-智能算法中台管理系统

智能算法中台管理系统,系统主要有样本中心,算法中心,模型中心等模块

u010479989的博客 2996

哗啦啦村的扩建

Problem Description呀呀呀,哗啦啦村在日渐发展中,越来越大了。 唐老师看到这欣欣向荣的情景,感到非常开心。 狗哥在旁边,“喏,我们村子扩建这么快,肯定用了不少钱吧?” 唐老师说:“是呀,不过这些钱都不及我零花钱的万万分之一。”那么这时候问题来了,唐老师的零花钱至少应该有多少钱呢? 狗哥也想知道这道题的答案,于是他拜托了青君同学,了解到了村子扩建的费用。 啊,原来村子的扩建

Techay的博客 972

在 SAP SD(销售与分销)模块中,销售合同 / 订单的抬头(Header) 和行项目(Item) 核心数据表如下,按 “核心表 + 扩展表” 分类说明,同时区分销售合同(Contract,类型 W

SAP SD模块中销售合同/订单的核心数据表分为抬头和行项目两类。核心抬头表包括VBAK(基础数据)和VBUK(状态数据),核心行项目表包括VBAP(基础数据)和VBUP(状态数据)。扩展表包含VBAKE(抬头增强)、VBAPe(行项增强)、VBEP(计划行)、VBFA(凭证流)等。销售合同(WK/WC)和订单(OR)通过VBAK-AUART字段区分,核心表结构相同。查询时需注意单据类型筛选,并通过VBELN主键关联抬头和行项数据,KNUMV关联定价条件,VBFA表追踪凭证流。

金牌架构师 1090

数据结构——链式前向星

是一种用于存储图结构(尤其是有向图)的高效数据结构,常用于图的遍历(如 DFS、BFS)、最短路径算法(如 Dijkstra、Bellman-Ford)、最小生成树算法等场景。的方式存储图的边信息,相比传统邻接表,具有代码实现简洁、空间利用率高、遍历效率稳定等优点。

2401_85315388的博客 1088

解锁RK3588芯片超强网络性能:多队列网卡与IRQ负载均衡实战

摘要:本文针对RK3588芯片的网络性能优化展开研究,重点探讨了多队列网卡配置和IRQ负载均衡技术。通过配置多队列网卡,将网络流量分散到多个队列处理,显著提升了吞吐量(测试显示提升67%)。同时,通过IRQ负载均衡配置使中断请求均匀分配到各CPU核心,CPU利用率降低至35%。文章详细介绍了配置步骤、测试方法,并分析了常见问题及解决方案。这些优化措施有效提升了RK3588在网络录像机、边缘计算等应用场景中的性能表现,为高性能网络应用提供了有力支持。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 498

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

链式前向星介绍以及原理

链式前向星

氷泠 1700

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

「学习笔记」链式前向星

链式前向星 图的存储一般有两种:邻接矩阵、邻接表(邻接表包括一种东西叫前向星)。 若图是稀疏图,边很少,开二维数组a[][]很浪费; 若点很多(如10000个点)a[10000][10000]又会爆.只能用前向星做.   前向星的效率不是很高,优化后为链式前向星,直接介绍链式前向星。   (一)链式前向星   1. 结构 这里用两个东西: 1 结构体数组edge存边,edge...

_Gion 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

链式前向星--最通俗易懂的讲解

如果说邻接表是不好写但效率好,邻接矩阵是好写但效率低的话,前向星就是一个相对中庸的数据结构。前向星固然好写,但效率并不高。而在优化为链式前向星后,效率也得到了较大的提升。虽然说,世界上对链式前向星的使用并不是很广泛,但在不愿意写复杂的邻接表的情况下,链式前向星也是一个很优秀的数据结构。 ...

sugarbliss 7万+

链式前向星,链表头插法的思想,数组的形式(数组下标间接代替指针)

这里写目录标题链式前向星(本质是用数组模拟链表的邻接表)无向图edge数组要开有向图的两倍vector < Edge > G[]与链式前向星( 算法竞赛中存图最常见的两种方法)优缺点对比对链式前向星存储的边进行bfs、dfs链式前向星对于最短路问题可以有很好的效果,尤其是稀疏图上 通常用在点的数目太多,或两点之间有多条弧的时候。一般在别的数据结构不能使用的时候才考虑用前向星。除了不能直接用起点终点定位以外,前向星几乎是完美的。【引自百度百科】 链式前向星(本质是用数组模拟链表的邻接表) 链式前

qq_51070956的博客 1163

「图::存储」链式邻接表|链式前向星(C++)

这一节我们来介绍两种以这三种基结构为基础实现的高级图存储结构:链式邻接表|链式前向星。

dakingffo的博客 2114

链式前向星 详解

链式前向星 链式前向星是一种类似于邻接表的存图方式,同样适用于有向 图和无向图。 他建立的是边与边之间的联系 它将边里的所有边都进行编号 int cnt; //边的编号 struct edge{ //边的结构体 int from,to,w,next; //from是边的起点(这个可有可无,因为他可以用head数组表示) //to是边的终点...

ReverieZH的博客 2843

链式前向星(Linked Forward Star)详解

使用三个数组 head[]、to[]、next[] 存储图的边,避免指针操作,提高缓存命中率。形式组织,head[u] 指向顶点 u 的第一条边,next[i] 指向下一条边。存储顶点 u 的第一条边的编号(初始为 -1,表示无出边)。链式前向星是竞赛中图的存储首选,尤其在对性能要求极高的场景!(边数远小于顶点数平方的图)的数据结构,结合了。无动态扩容开销(适合竞赛编程的极限优化)。的快速访问优势,广泛用于图论算法(如。的下一条边的编号(类似链表指针)。(可选)存储第 i 条边的权重。(如 Dinic)。

Beymax_Lzc的博客 1108
上一篇: Hidden String(模拟)
下一篇: Equivalent Strings(二分+递归深搜)
林下的码路
博客等级 码龄12年 295粉丝 506原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林下的码路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值