考察知识点:生成树
本题其实不用建树,对比两棵树的差异即可,当生成树 a 有而生成树 b 没有的边的数量不等于生成树 a 没有而生成树 b 有的边的数量时输出 -1
(事实上,可以证明对于两棵节点相同的生成树,这两个值一定相等),否则输出相差边数之和的一半。
时间复杂度:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
void solve()
{
int n;
while (cin >> n)
{
set<pii> s;
for (int i = 0; i < n - 1; i++)
{
int u, v;
cin >> u >> v;
s.insert({u, v});
}
int ans = 0;
for (int i = 0; i < n - 1; i++)
{
int u, v;
cin >> u >> v;
if (s.count({u, v}))
s.erase({u, v});
else if (s.count({v, u}))
s.erase({v, u});
else
ans++;
}
if (ans != s.size())
cout << -1 << endl;
else
cout << ans << endl;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}