D. Maximum Distance(最小生成树)

这篇具有很好参考价值的文章主要介绍了D. Maximum Distance(最小生成树)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Problem - D - Codeforces

D. Maximum Distance(最小生成树)

 

Chouti已经厌倦了乏味的作业,于是他打开了数年前创建的一个旧编程问题。

给定一个具有n个节点和m条加权边的连通无向图。其中有k个特殊节点:x1,x2,...,xk。

现在定义路径的成本为其边权的最大值。两个顶点之间的距离定义为连接它们的路径的最小成本。

对于每个特殊节点,请找到与其距离最远(根据上述定义,即相应距离是可能的最大值)的另一个特殊节点,并输出它们之间的距离。

由于原始限制非常小,所以他认为这个问题很无聊。现在,他提高了限制,并希望您能为他解决这个问题。

输入 第一行包含三个整数n、m和k(2≤k≤n≤105,n−1≤m≤105)——节点数、边数和特殊节点数。

第二行包含k个不同的整数x1,x2,…,xk(1≤xi≤n)。

接下来的m行,每行包含三个整数u、v和w(1≤u,v≤n,1≤w≤109),表示存在一条权值为w的边连接u和v。给定的图是无向的,因此边(u,v)可以在两个方向上使用。

图可能有多条边和自环。

保证图是连通的。

输出 第一行应包含k个整数。第i个整数是xi与离它最远的特殊节点之间的距离。

Examples

input

Copy

2 3 2
2 1
1 2 3
1 2 2
2 2 1

output

Copy

2 2 

input

Copy

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

output

Copy

3 3 3 

在第一个例子中,顶点 1 和顶点 2 之间的距离等于 2,因为它们之间有一条权重为 2 的边。因此,对于顶点 1 和顶点 2 来说,到最远节点的距离都是 2。

在第二个例子中,可以发现顶点 1 和顶点 2 之间、顶点 1 和顶点 3 之间的距离都是 3,而顶点 2 和顶点 3 之间的距离是 2。

该图可能存在多个边和自环,如第一个例子所示。

题解:
由于我们找的是特殊节点之间的最短距离,这道题比较特殊的是两点间的路径长度为,中间遍历过的最大边权值

由于题中两点距离是最小成本,相当于两点最小的路径长度,既然求的最小我们可以先利用最小生成树,把不需要的边去掉,这样一定最优

现在就变成了一棵树了,那么从任意一个特殊点开始,到其他所有特殊点,中途遍历过最长的边权,就是

离它最远的特殊节点之间的距离

这个距离对于所有特殊点,都适用

因为我们是从一个特殊点开始的,我们找的这个最长边权的两侧,肯定都有特殊点,这样两边的点都可以经过这个最长边权文章来源地址https://www.toymoban.com/news/detail-428476.html

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define int long long
typedef pair<int,int> PII;
int mod = 998244353;
int n,m,k;
struct node
{
	int l,r,x;
}a[100050];
int b[100050];
int f[100050];
int cmp(node a,node b)
{
	return a.x < b .x;
}
int find(int x)
{
	if(f[x] == x)
	return x;
	return f[x] = find(f[x]);
}
vector<PII> p[100050];
int d[100050];
void dfs(int x,int fa)
{
	for(PII ne:p[x])
	{
		if(ne.first == fa)
		continue;
		d[ne.first] = max(d[x],ne.second);
		dfs(ne.first,x);
	}
}
void solve()
{
	cin >> n >> m >> k;
	for(int i = 1;i <= k;i++)
	{
		cin >> b[i];
	}
	for(int i = 1;i <= m;i++)
	{
		cin >> a[i].l >> a[i].r >> a[i].x; 
	}
	for(int i = 1;i <= n;i++)
	f[i] = i; 
	sort(a + 1,a + 1 + m,cmp);
	for(int i = 1;i <= m;i++)
	{
		int x = find(a[i].l);
		int y = find(a[i].r);
		if(x != y)
		{
			f[x] = y;
			p[a[i].l].push_back({a[i].r,a[i].x});
			p[a[i].r].push_back({a[i].l,a[i].x});
		}
	}
	dfs(b[1],0);
	int ma = 0;
	for(int i = 1;i <= k;i++)
	ma = max(ma,d[b[i]]);
	for(int i = 1;i <= k;i++)
	cout << ma <<" ";
}
//5 7 8 9 10

signed main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	int t = 1;
//	cin >> t;
	while(t--)
	{
		solve(); 
	}
}

到了这里,关于D. Maximum Distance(最小生成树)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Codeforces Round 892 (Div. 2) D. Andrey and Escape from Capygrad

    题意:给定区间[l,r],[a,b],[a,b]包含于[l,r],可以从任意[l,r]的区间传送至[a,b],给定指定的点求能传送的最远距离。 思路:可以将区间简化为[l,b],因为l可以看作是最左边,b可以看作是能到达的最右端点,然后进行区间合并即可。 对于查询,我们使用二分去找 x所在的区间,方法

    2024年02月13日
    浏览(36)
  • Codeforces Round 768 (Div. 1) D. Flipping Range(思维题 等价类性质 dp)

    题目 思路来源 官方题解 洛谷题解 题解 可操作的最短区间长度肯定是gcd,记为g,然后考虑如何dp 考虑g个等价类,每个等价类i,i+g,i+2*g,... 每次翻转长度为g的区间,会同时影响到g个等价类总的翻转的奇偶性, 性质一:只有每个等价类翻的次数奇偶性相同才合法  性质二:此

    2024年01月19日
    浏览(34)
  • Codeforces Round 890 (Div. 2) D. More Wrong(交互题 贪心/启发式 补写法)

    题目 t(t=100)组样例,长为n(n=2000)的序列 交互题,每次你可以询问一个区间[l,r]的逆序对数,代价是 要在的代价内问出最大元素的位置,输出其位置 思路来源 neal Codeforces Round 890 (Div. 2) supported by Constructor Institute D (交互+分治) 附加强 - 知乎 题解 赛中开题顺序大失败没看这个

    2024年02月14日
    浏览(38)
  • Codeforces Round 169 (Div. 2)C. Little Girl and Maximum Sum(差分、贪心)

    C. Little Girl and Maximum Sum 给q个[l,r]将所有这些区间里面的数相加和最大。 可以进行的操作是任意排列数组 对出现的每个区间内的位置加上1,代表权值 操作完之后求一遍前缀和,得到每个位置的权值 然后贪心的考虑,权值越大,应该分配给该位置的数越大越好这样对答案的贡

    2024年02月21日
    浏览(37)
  • 动态规划问题-最小编辑距离(Minimum Edit Distance)

    我们今天要探讨的动态规划问题来源于俄罗斯科学家Levenshtein提出的两个对象之间的不相似度,在音频、语言翻译等领域有广泛的应用。如果用于评估字符串之间的不相似度,那么又称为最小编辑距离MED(Minimum Edit Distance),它规定从string 1到转换成 string 2的最少操作数,最少操

    2024年02月09日
    浏览(53)
  • 解决:STM32CubeMX生成MDK代码提示项目有问题(...have a problem)

    通过STM32CubeMX进行STM32项目创建过程中,在生成MDK代码时提示\\\"The Code is successfully generated under C:/TEST/LED but MDK-ARM V5 Project genera have a problem\\\"的解决办法: 1、检查项目名称是否为存在特殊字符、中文等,例如:例题1; 2、检查项目创建路径是否存在特殊字符、中文或空格等,例如

    2024年02月16日
    浏览(41)
  • 考研算法复试刷题19天:Prim算法求最小生成树 【prim,最小生成树】

    参考博客:图解:什么是最小生成树? - 知乎 (zhihu.com)  总结下来的过程就是,一张图,我们将他化为树的形式,也就是生成树。那么最小生成树有是啥呢? 所谓一个 带权图 的最小生成树,就是原图中边的权值最小的生成树 ,所谓最小是指边的权值之和小于或者等于其它

    2024年02月07日
    浏览(62)
  • 【算法每日一练]-图论(保姆级教程篇7 最小生成树 ,并查集模板篇)#村村通 #最小生成树

    目录 题目:村村通 并查集  题目:最小生成树 kruskal算法 prim算法          先引入问题: 要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的 任意两个之间都可以通信 ,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要 使铺设光

    2024年02月04日
    浏览(77)
  • MATLAB 最小生成树

    ✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 最小生成树(Minimum Spanning Tree, MST) 是一种用于

    2024年02月06日
    浏览(64)
  • 最小生成树matlab求解

    连通所有顶点且总路径最小 修建连通7个城市的铁路网,可修建的路线和对应造价如图所示,如何修建使总费用最少? 问题分析: 连通7个城市:生成的图中,从任意顶点起步,沿着边一定可以到达所有的其他顶点,这种图叫连通图。 可修建的路线和对应造价:图的边,及其

    2024年02月05日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包