题意
你有一张n个点的完全图(即任意两点之间都有无向边) 现在给出这张图的两棵生成树 定义一次操作为:
在任意一棵生成树中删除一条边后再加入一条边(必须在同一棵树中操作),
同时需要保证操作完后仍然是一棵树,问使得两棵树相同的最少操作次数,若不存在合法的操作方案,输出-1注意:这里的相同指的是点集与边集均相同,也就是对于第一棵树中的边(u, v),第二棵树中一定存在边(u, v)或(v, u),再不懂请看样例解释。
输入
一个整数n表示无向图的点数
接下来n - 1行
每行两个整数u, v表示第一棵生成树中的边
再接下来n - 1行
每行两个整数u, v表示第二棵生成树中的边
输出
一个整数,表示最少操作次数
Sample Input
6
6 1
1 2
2 3
3 5
5 4
1 2
2 4
4 5
5 3
6 4
Sample Output
2
Note
2⩽n⩽1e5
保证输入数据合法
解题思路
我们先把第一个图建好,然后在读入第二个图的时候,判断 u ,v 是否连通,如果不连通就让操作次数 ++
等到读完第二个图,得到的操作次数即为最少
AC代码
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5+5;
int edge[maxn];
int main()
{
int n;
cin>>n;
int u,v;
for(int i = 0 ; i < n-1 ; i++)
{
cin>>u>>v;
edge[u] = v;//u --> v
}
int cnt = 0;
for(int i = 0 ; i < n-1 ; i++)
{
cin>>u>>v;
if(edge[u] != v && edge[v] != u)//连通u-->v?
{
cnt++;
}
}
cout<<cnt<<endl;
return 0;
}