题目:
分析:只能想到暴力法,从一个点出现,经过的点都加入到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;
}
}