洛谷:P3398 仓鼠找sugar(图,lca)

题目:

在这里插入图片描述

分析:只能想到暴力法,从一个点出现,经过的点都加入到vector(还可以其他)中,直到另一个目标点为止。

但是,数据不止一组。

lca:

在这里插入图片描述

暴力法尝试,1个vector,1个set,判断元素重复,很好。代码:

#include<bits/stdc++.h>
using namespace std;
int m,n;
vector<vector<int> > vv;
int A[100005];
vector<int> v;
set<int> s;
int a,b,c,d;
bool f_vector(int fa,int now,vector<int> v2)
{
 v2.push_back(now);
 if(now==b) {
  v=v2;
  return 1;
 }
 for(int i=0;i<vv[now].size();i++)
 {
  if(vv[now][i]==fa) continue;
  if(f_vector(now,vv[now][i],v2)) return 1;
 }
 return 0;
}
bool f_vector(int fa,int now,set<int> v2)
{
 v2.insert(now);
 if(now==d) {
  s=v2;
  return 1;
 }
 for(int i=0;i<vv[now].size();i++)
 {
  if(vv[now][i]==fa) continue;
  if(f_vector(now,vv[now][i],v2)) return 1;
 }
 return 0;
}
bool f()
{
 for(int i=0;i<v.size();i++)
 {
  if(s.count(v[i])==1) return 1;
 }
 return 0;
}
int main()
{
 cin>>m>>n;
 for(int i=0;i<=m;i++) vv.push_back(v);
 for(int i=1;i<m;i++)
 {
  cin>>a>>b;
  vv[a].push_back(b);
  vv[b].push_back(a);
 }
 for(int i=0;i<n;i++)
 {
  cin>>a>>b>>c>>d;
  vector<int> vv2;
  f_vector(-1,a,vv2);
  set<int> ss2;
  f_vector(-1,c,ss2);
  if(f()) cout<<"Y";
  else cout<<"N";
  cout<<endl;
 }
}
/*
5 1
2 5
4 2
1 3
1 4
5 1 5 1
*/

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/108434606