首页 > 其他分享 >CF638C题解

CF638C题解

时间:2024-02-20 11:36:01浏览次数:22  
标签:方案 int 题解 vector MAXN 节点 CF638C

我们可以针对一个顶点只能同时修一条边这个条件设计方案。

由于每条边都要修一遍,同样某天修理的方案放在哪一天修都无所谓,我们采用贪心的策略,在原有的方案上尽可能多地修边。

根据上面的性质,我们只需要将同一顶点的边放在不同的某天修理的方案中,使方案尽可能的少即可。
跑一遍 dfs,用 std::vector<int> 记录修理的方案就行了。

上述记录方案的过程中对于一个假定的根节点(根节点为 \(1\) 会比较好处理)会将边分别放入一个方案中,在向下遍历的过程中的节点都会有连接父节点的边被放入已有的一个方案中,所以会出现节点最大度数个方案,即最短时间为节点的最大度数。

代码如下。

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
typedef pair<int,int> pii;
constexpr int MAXN=2e5+10;
int n,deg[MAXN],maxdeg,cnt;
vector<pii> e[MAXN];
vector<int> g[MAXN];
void add(int u,int v,int id){
    e[u].pb({v,id});
}
void dfs(int u,int fa,int gr){
    int p=1;
    for(int i=0;i<e[u].size();++i){
        if(e[u][i].first!=fa){
            if(p==gr)++p;
            g[p].pb(e[u][i].second);
            cnt=max(p,cnt);
            ++p;
            dfs(e[u][i].first,u,p-1);
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1,u,v;i<n;++i){
        scanf("%d%d",&u,&v);
        add(u,v,i);add(v,u,i);++deg[u];++deg[v];
    }
    for(int i=1;i<=n;++i)maxdeg=max(deg[i],maxdeg);
    printf("%d\n",maxdeg);
    dfs(1,0,0);
    for(int i=1;i<=cnt;++i){
        printf("%d ",g[i].size());
        for(int j:g[i]){
            printf("%d ",j);
        }
        puts("");
    }
    return 0;
}

标签:方案,int,题解,vector,MAXN,节点,CF638C
From: https://www.cnblogs.com/LiJoQiao/p/18022704

相关文章

  • Docker 使用遇到的问题解决 更改Tag
    dockertagconsul:1.15.4consul:latestdockerrmiconsul:1.15.4删除制定版本在运行时,有些镜像拉取时报错我这里 时 consu,只能制定版本下载1.15.4Errorresponsefromdaemon:manifestforconsul:latestnotfound:manifestunknown:manifestunknown ......
  • P2171 Hz吐泡泡 题解
    传送门题目背景Hz大大是一种可爱的动物(神)。他很喜欢吐泡泡(更喜欢写作业)。题目描述这天,Hz大大心血来潮,吐了n个不同的泡泡玩(保证没有重复的泡泡)。因为他还要写作业,所以他请你帮他把这些泡泡排序成树(左子树<=根<右子树)。输出它的后序遍历。输入格式共2行。第一行,1个整数n。(1<......
  • 洛谷P10179 题解
    题意简述给定\(n\)个点,要求构造出一棵树,同时有\(m\)个事件,第\(i\)个事件要求\(u_i\)和\(v_i\)用两条树边连接,即当中相隔一个点。若存在构造方案,输出Yes并输出其中一种方案,否则输出No。思维路径首先简化问题,假如我们想让一堆点互相相隔一个点,我们的做法。考虑菊花......
  • 程序设计天梯赛个人题解 L2-047-2 锦标赛
    题目分析综合题意,将最后一场比赛视为顶层,第一轮比赛视为第一层,则有:下层每场比赛选出一个胜者,每两个下层的胜者间举行本层的一次比赛,显然这是一个二叉树。考虑还原建立每场比赛的树。由于最后一层的比赛是$2^k$个选手参加,故这是个完美二叉树,使用完全二叉树的数组储存方式,则标号......
  • 洛谷-P3380/LibreOJ-106/BZOJ-3196题解
    题意简述给定一个数列,支持以下操作:查询\(k\)在区间内的排名(区间内比\(k\)小的数的个数\(+1\))查询区间内排名为\(k\)的值修改某一位值上的数值查询\(k\)在区间内的前驱(前驱定义为严格小于\(k\),且最大的数,若不存在输出-2147483647)查询\(k\)在区间内的......
  • U41492 树上数颜色 题解
    U41492树上数颜色题目描述给一棵根为1的树,每次询问子树颜色种类数输入格式第一行一个整数n,表示树的结点数接下来n-1行,每行一条边接下来一行n个数,表示每个结点的颜色c[i]接下来一个数m,表示询问数接下来m行表示询问的子树输出格式对于每个询问,输出该子树颜色数输入输出......
  • P2524 Uim的情人节礼物•其之弐 题解
    题目描述前传:详见洛谷P2525Uim成功地按照顺序将礼物送到了 N 个妹子的手里并维持她们的和谐。现在Uim现在想知道,他最终选择的顺序是所有给 N 个妹子送礼顺序中,字典序第几小的。送礼顺序可以看作1,2,⋯,N 的一个排列。输入格式第一行一个整数N,表示有 N 个数。第二......
  • P3411 序列变换 题解
    自己做不出来,看现在题解区的题解讲的都不咋清楚。懂了之后来为后人铺路。而且我的马蜂比较好看题目传送门我能看懂这道题,主要是依靠了这篇题解的帮助。首先我们只关注数的相对关系,所以可以离散化。注意到值域\(10^6\),用数组离散化。这道题可以用贪心做。(有一些定义先往下看)......
  • P5914 MOS 题解
    一道练习贪心证明的好题。绝大多数题解只是点出了以下结论:要么最快的带最慢的;要么最慢的带次慢的。并没有给出证明。我就补上这个证明。为了证明这个贪心结论,我们先证明几个引理。引理一:每次将火把带回来的,一定是对岸最快的。引理一证明:如果回来的不是对岸最快的,让对岸最......
  • CF167B题解
    CF167B这里更容易进入且有翻译题意给定初始背包容量\(k\),要进行\(n\)场比赛,每场比赛有\(p_i\%\)的概率能够胜利,赢的一场比赛能获得一个奖励——当\(a_i=-1\)时获得一个体积为\(1\)的奖品,或者当\(a_i>0\)时给背包增加\(a_i\)容量,求所有比赛结束后至少赢得\(......