道路修建 链式前向星+dfs

在 W 星球上有 nn 个国家。为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通。但是每个国家的国王都很吝啬,他们只愿意修建恰好 n - 1n−1 条双向道路。

每条道路的修建都要付出一定的费用,这个费用等于道路长度乘以道路两端的国家个数之差的绝对值。例如,在下图中,虚线所示道路两端分别有 22 个、44 个国家,如果该道路长度为 11,则费用为 1 \times \lvert 2 - 4 \rvert =21×∣2−4∣=2。图中圆圈里的数字表示国家的编号。

由于国家的数量十分庞大,道路的建造方案有很多种,同时每种方案的修建费用难以用人工计算,国王们决定找人设计一个软件,对于给定的建造方案,计算出所需要的费用。请你帮助国王们设计一个这样的软件。

输入格式

输入的第一行包含一个整数 nn,表示 W 星球上的国家的数量,国家从 11 到 nn 编号。

接下来 n - 1n−1 行描述道路建设情况,其中第 ii 行包含三个整数 a_iai​、b_ibi​ 和 c_ici​,表示第 ii 条双向道路修建在 a_iai​ 与 b_ibi​ 两个国家之间,长度为 c_ici​。

输出格式

输出一个整数,表示修建所有道路所需要的总费用。

数据范围和约定

对于所有数据,保证 1 \le a_i, b_i \le n, 0 \le c_i \le 10^61≤ai​,bi​≤n,0≤ci​≤106.

测试点编号n=n=
122
21010
3100100
4200200
5500500
6600600
7800800
810001000
910,00010,000
1020,00020,000
1150,00050,000
1260,00060,000
1380,00080,000
14100,000100,000
15600,000600,000
16700,000700,000
17800,000800,000
18900,000900,000
191,000,0001,000,000
201,000,0001,000,000

Sample Input

6
1 2 1
1 3 1
1 4 2
6 3 1
5 2 1

Sample Output

20
​
#include <iostream>
#include <cmath>
using namespace std;
const int MAXN = 1e6+10;
struct info{
	int to,nt,w;
};
info node[2*MAXN];
typedef long long ll;
ll size[MAXN],ans;
int cnt,n,pre[MAXN];
void add(int x,int y,int z)
{
	cnt++;
	node[cnt].to = y;
	node[cnt].w = z;
	node[cnt].nt = pre[x];
	pre[x] = cnt;
}
void dfs(int x,int fa)
{
	size[x] = 1;
	for(int i = pre[x];i;i = node[i].nt){
		int to = node[i].to;
		if(to == fa)
			continue; //防止往回搜索
		dfs(to,x); //搜索子结点
		size[x] += size[to];
		ans += node[i].w * abs(2*size[to] - n);
	}
}
int main()
{
	scanf("%d",&n);
	for(int i = 1;i < n;i++){
		int x,y,z;
		scanf("%d %d %d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	dfs(1,0);
	printf("%lld",ans);
	return 0;
 } 

​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前向星和链式前向星的区别在于实现方式和数据结构的不同。 前向星是一种存储图的边的数据结构,它使用两个数组来存储边的信息。一个数组存储每个顶点的第一条边的索引,另一个数组存储每条边的下一条边的索引。这种方式可以方便地遍历每个顶点的所有边。 链式前向星是一种基于链表的存储方式,它使用链表来存储每个顶点的边。每个顶点都有一个指向第一条边的指针,每条边都有一个指向下一条边的指针。这种方式可以动态地添加和删除边。 总结来说,前向星使用数组存储边的信息,链式前向星使用链表存储边的信息。链式前向星相比前向星更加灵活,可以方便地进行边的插入和删除操作。但是链式前向星的空间复杂度较高,因为需要额外的指针来存储链表的连接关系。 引用\[1\]中提到,链式前向星的整体结构很像邻接表,但是实现方式不同。链式前向星的思想和邻接表一致,只是在实现上有所区别。因此,链式前向星的使用和邻接表相一致,可以用于存储和遍历图的边的信息。 #### 引用[.reference_title] - *1* *2* *3* [链式前向星](https://blog.csdn.net/MuShan_bit/article/details/123882339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值