CodeFroces gym 100781 A.Adjoin the Networks(贪心)

题意:给出一张图,存在多棵树,你要把这些树连起来,形成一棵树,令这棵树的直径最小。

解法:很容易想到贪心一下就行了,找出直径最长的树的根作为连起来后的树的根,其他树的根连到这个根即可。然后求一下树的直径。难点在于怎么规定一个树的根,使得这棵树的深度最小。下面写的是类似于LCA两个端点向上走的方法,有dalao告诉我可以树形dp+dfs找。这都是可以的。但是注意:树的重心并不一定是这个最优的根。

代码如下:

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<utility>
#include<stack>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<map>
using namespace std;
typedef pair <int, int> pii;
const int maxn = 1e5 + 5;
int head[maxn], to[maxn << 1], nx[maxn << 1], tot;
bool vst[maxn];
int Min = 0x3f3f3f3f, key, dis[maxn], pre[maxn];
int n, l, mycnt; 
int path1[maxn], path2[maxn], path[maxn], cnt1 = 0, cnt2 = 0, cnt = 0;

void add_edge(int u, int v) {
	to[tot] = v, nx[tot] = head[u], head[u] = tot++;
	swap(u, v);
	to[tot] = v, nx[tot] = head[u], head[u] = tot++;
}

vector <pii> vec;
int Max_dis;

void dfs(int u, int par, int _dis) {
	vst[u] = 1; pre[u] = par;
	mycnt++;
	dis[u] = _dis;
	for(int i = head[u]; ~i; i = nx[i]) {
		int v = to[i];
		if(v != par) {
			dfs(v, u, _dis + 1);
		}
	}
	if(_dis > Max_dis) {
		key = u;
		Max_dis = _dis;
	}
}

int cal(int x, int y) {
	cnt1 = cnt2 = cnt = 0;
	while (dis[x] > dis[y]) {
		path1[cnt1++] = x; x = pre[x];
	}
	while (dis[y] > dis[x]) {
		path2[cnt2++] = y; y = pre[y];
	}
	while (x != y) {
		path1[cnt1++] = x; x = pre[x];
		path2[cnt2++] = y; y = pre[y];
	}
	for (int i = 0; i < cnt1; ++i) {  
		path[cnt++] = path1[i];
	}
	path[cnt++] = x;
	for (int i = cnt2 - 1; i >= 0; --i) {  
		path[cnt++] = path2[i];
	}
//	for (int i = 0; i < cnt; ++i) {
//		printf("%d ", path[i]);
//	}
//	printf("\n");
	return path[cnt / 2];
}

int main() {
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);
#endif
	memset(head, -1, sizeof(head));
	tot = 0;
	scanf("%d%d", &n, &l);
	for(int i = 0, u, v; i < l; i++) {
		scanf("%d%d", &u, &v);
		add_edge(u, v);
	}
	for(int i = 0; i < n; i++) {
		if(!vst[i]) {
			Max_dis = -1; 
			int t1, t2, t3;
			dfs(i, i, 0);
			Max_dis = -1;
			mycnt = 0;
			t1 = key; 
			dfs(key, key, 0); 
			t2 = key; 
			t3 = cal(t1, t2);
			if(mycnt != 1)
				vec.push_back(pii(cnt / 2, t3));
			else
				vec.push_back(pii(0, i));
		}
	}
	
	sort(vec.begin(), vec.end());
	int root = vec[vec.size() - 1].second;
	for(int i = vec.size() - 2; i >= 0; i--) {
		add_edge(root, vec[i].second);
	}
	Max_dis = -1;
	dfs(0, 0, 0);
	Max_dis = -1;
	dfs(key, key, 0);
	printf("%d\n", Max_dis);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自2020年以来,自动驾驶汽车(Autonomous Vehicle)在这一领域取得了显著进展。 自动驾驶汽车通过使用先进的传感技术,如雷达、激光雷达和摄像头,以及深度学习和人工智能算法,实现了车辆的自主驾驶。它们能够感知周围环境,了解道路状况,并做出相应的决策和行驶动作,从而实现无需人类操控的车辆行驶。 自动驾驶汽车在2020年迅速崭露头角。它们的技术日益成熟,不断的实验和测试表明其在安全性和性能方面已经取得了显著的突破。虽然仍然存在一些挑战,比如在复杂城市环境中导航和处理紧急情况,但这些问题正经过不断的研究和改进来得以解决。 在未来,自动驾驶汽车有望在各个领域发挥重要作用。首先,它们将可以提高道路交通的安全性。由于自动驾驶车辆不受人类司机的疲劳、分心和驾驶误差的限制,它们的驾驶能力更为稳定和准确。其次,自动驾驶汽车还能够提高交通效率。通过与其他车辆实时通信和协同,它们可以避免交通堵塞和减少事故发生,从而减少交通拥堵和行车时间成本。 此外,自动驾驶汽车也将为交通出行带来便利和舒适性。乘客可以更轻松地进行其他活动,如工作、休息或娱乐,而不必担心驾驶问题。老年人和残障人士也将能够自由独立地出行,提高他们的生活质量。 综上所述,作为2020年的重要趋势,自动驾驶汽车具有广阔的应用前景。通过不断的创新和发展,它们将在道路交通安全、交通效率和出行体验方面取得进一步的提升。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值