Bootstrap

蓝桥杯真题0团建dfs+哈希表/邻接表

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;//如果序列开始不同直接return
  cont=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;
}

;