生成树

生成树传送门

题意

你有一张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

来源:牛客网  https://ac.nowcoder.com/acm/contest/6607/A

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值