码迷,mamicode.com
首页 > 其他好文 > 详细

Edge Weight Assignment

时间:2020-04-13 23:09:29      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:最大   tps   存在   try   很多   一个   main   不可   ref   

D - Edge Weight Assignment

参考:Codeforces Round #633 Editorial

感觉这个题关键之处在于,要会将图化为一棵树,这样逻辑会清晰很多。

如果叶子之间距离存在有奇数(非1),那么最小的 f 值一定为3,否则为1。可以通过求解其他叶子节点到某一个叶子节点的距离得出,得出的结论对任何一个节点都成立(即如果该节点满足,那么其他节点也满足)。

另一个很重要的结论就是如果存在一个父节点连接两个叶子节点的情况的话,那么 f 的最大值需要减1,因为叶子节点的值已确定,不可能再有别的变化。

// Created by CAD on 2020/4/13.
#include <bits/stdc++.h>
using namespace std;

const int maxn=1e5+5;
vector<int> e[maxn];
bool bj=0;
void dfs(int u,int fa=0,int x=0){
    for(auto i:e[u])
        if(i!=fa) dfs(i,u,x^1);
    if(e[u].size()==1&&x) bj=1;
}
int vis[maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
//    FOPEN;
    int n;cin>>n;
    for(int i=1,x,y;i<=n-1;++i)
        cin>>x>>y,e[x].push_back(y),e[y].push_back(x);
    for(int i=1;i<=n;++i)
        if(e[i].size()==1){
            dfs(i);break;
        }
    int ans=n-1;
    for(int i=1;i<=n;++i)
        if(e[i].size()==1)
            ans-=vis[e[i][0]],vis[e[i][0]]=1;
    cout<<(bj?3:1)<<" "<<ans<<"\n";
    return 0;
}

Edge Weight Assignment

标签:最大   tps   存在   try   很多   一个   main   不可   ref   

原文地址:https://www.cnblogs.com/CADCADCAD/p/12694311.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!