dfs+邻接表储存或者哈希表的运用,考察我们对数据的存储
本题核心就是在求从根节点开始的两棵树相同的最长序列,首先确定用dfs进行深搜,对于节点的形式可以用邻接表,邻接矩阵,哈希表来进行存储数据。下面看代码
邻接表
#include <bits/stdc++.h>
using namespace std;
int n,m;
int mp[200005];
int np[200005];
vector<int> v1[200005];
vector<int> v2[200005];
int cont;//记录最长的相同序列
void dfs(int x,int y,int sum)
{if(np[x]!=mp[y]) return;//如果序列开始不同直接returncont=max(cont,sum+1);//开始遍历相邻的节点for(auto& i:v1[x]){for(auto& j:v2[y]){dfs(i,j,sum+1);}}
}
int main()
{cin>>n>>m;for(int i=0;i<n;i++){cin>>np[i];}for(int j=0;j<m;j++){cin>>mp[j];}int l,r;for(int i=0;i<n-1;i++){cin>>l>>r;v1[l].push_back(r);}for(int i=0;i<m-1;i++){cin>>l>>r;//邻接表储存v2[l].push_back(r);}dfs(1,1,0);cout<<cont;return 0;
}
map
#include <bits/stdc++.h>
#define N 200005
using namespace std;
map<int,vector<int>> m1,m2;
int n,m,a[N],b[N],ans,u,v;
void dfs(int x,int y,int count)
{if(a[x]!=b[y])return;ans=max(ans,count+1);//记录最长相同序列长度for(int i=0;i<m1[x].size();i++){for(int j=0;j<m2[y].size();j++){int a1=m1[x][i];int b1=m2[y][j];}dfs(a1,b1,count+1);//搜索所有相邻节点}
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=m;i++)cin>>b[i];for(int i=1;i<=n-1;i++){cin>>u>>v;m1[u].push_back(v);}for(int i=1;i<=m-1;i++){cin>>u>>v;m2[u].push_back(v);}dfs(1,1,0);
cout<<ans;
}