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;
}
CAD加油!欢迎跟我一起讨论学习算法,QQ:1401650042