2020多校联赛,第二场C-Cover the Tree
程序员文章站
2022-06-23 10:01:55
题意给定一个无根树。如何将树的边缘都至少被一条链所覆盖题意比赛时理解错了,最后树,只要两个边缘的叶子节点连接在一起就可以,之前以为要将所有边缘点连接在一起。解题思路首先从一个非叶子节点出发,通过dfs寻找所有叶子节点,存起来,之后两两相连即可,当初存储方式有些问题,内存过大。最后输出也理解错了,现在看来还可以。#include#include#include#include
题意
给定一个无根树。如何将树的边缘都至少被一条链所覆盖
题意比赛时理解错了,最后树,只要两个边缘的叶子节点连接在一起就可以,之前以为要将所有边缘点连接在一起。
解题思路
首先从一个非叶子节点出发,通过dfs寻找所有叶子节点,存起来,之后两两相连即可,当初存储方式有些问题,内存过大。最后输出也理解错了,现在看来还可以。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<deque>
const int mod = 998244353;
using namespace std;
typedef long long ll;
vector<int> tree[500000], Q;
int mins = 99999999;
void dfs(int root,int fa)
{
if (tree[root].size() == 1)
Q.push_back(root);
for (int i = 0; i < tree[root].size(); i++)
{
if (tree[root][i] != fa)
{
dfs(tree[root][i], root);
}
}
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie();
int n;
cin >> n;
int sum = 0;
for (int i = 1; i < n; i++)
{
int root;
cin >> root;
int zi;
cin >> zi;
tree[root].push_back(zi);
tree[zi].push_back(root);
}
int root = 1;
while (tree[root].size() == 1)
root++;
dfs(root, -1);
int load = -1;
cout << (Q.size()+1)/2<<endl;
for (int i = 0; i < (Q.size()+1)/2; i++)
cout<<Q[i]<< ' '<<Q[(i + Q.size() / 2) % Q.size()]<<endl;
}
本文地址:https://blog.csdn.net/weixin_43832788/article/details/107406820
推荐阅读
-
【杭电多校2020】第二场1001.Total Eclipse(并查集)
-
2020牛客暑期多校训练营(第二场)Cover the Tree
-
2020牛客暑期多校训练营(第二场)C Cover the Tree
-
2020牛客暑期多校训练营(第二场)Cover the Tree 题解(dfs序)
-
2020牛客暑期多校 第二场 B Boundary(计算几何)
-
2020多校联赛,第二场C-Cover the Tree
-
2020牛客暑期多校第二场题解
-
2020牛客暑期多校第二场 C - Cover the Tree(思维/贪心)
-
2020牛客多校第十场C-Decrement on the Tree
-
2020牛客多校十C-Decrement on the Tree