D. Edge Weight Assignment Codeforces Round #633 (Div. 2)

在這裏插入圖片描述

連接java

思路web

  1. 最小:若是任意兩個葉節點之間的距離爲偶數,答案爲1;若是存在兩點之間的距離爲奇數,答案爲3
  2. 最大:最多爲n-1,若是存在兩個葉節點的距離爲2,則答案 -1

實現svg

  1. 全部點到根節點的距離同奇或者同偶,則說明任意兩點之間的距離爲偶數
  2. 距離爲2的兩個葉節點,只需統計入度爲1節點的父節點的葉節點數量,便可計算
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5,mod=1e9+7;
const int inf=0x3f3f3f3f;

int n;
vector<int> G[maxn];
int in[maxn],depth[maxn],f[maxn];

void dfs(int u,int fa=-1)
{
	for(auto v: G[u])
	{
		if(v==fa)
			continue;
		depth[v]=depth[u]+1;
		dfs(v,u);
	}
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n-1;++i)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		G[u].push_back(v);
		G[v].push_back(u);
		in[u]++,in[v]++;
	}
	for(int i=1;i<=n;++i)
		if(in[i]==1)
			f[G[i][0]]++;
	
	int ans=n-1;
	for(int i=1;i<=n;++i)
		ans-=max(0,f[i]-1);
	
	dfs(1);
	bool a=false,b=false;
	for(int i=1;i<=n;++i)
		if(in[i]==1)
			if(depth[i]&1) 
				a=true;
			else
				b=true;
				
	printf("%d %d\n",a&&b?3:1,ans);
	return 0;
}