#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
typedef pair<int,int> pii;
vector<int>edge[N]; //存邻接点
int n,m;
int w[N]; //存边权
map<pii,int>id; //存边的编号id
bool dfs(int s,int u,int father,int v){
if(u==v){
return true; //如果已经到终点,则返回true
}
for(int i=0;i<edge[u].size();i++){ //遍历当前位置的邻接点
int son=edge[u][i]; //标清子节点的位置
if(son==father) //如果子节点等于父节点,则继续寻找
continue;
if(dfs(s,son,u,v)){ //son变成当前点,u变成father点
int ID=id[{u,son}];//[{}]可用于初始化数组
w[ID]++;//该边对应的编号边权加一
return true;
}
}
return false;
}
void solve(){
cin>>n>>m;
for(int i=0;i<n-1;i++){
int x,y;cin>>x>>y;
edge[x].push_back(y);//遍历每条边并存储
edge[y].push_back(x);
id[{x,y}]=id[{y,x}]=i; //正反都给这条边标记id相同
}
for(int i=0;i<m;i++){
int x,y;cin>>x>>y;
dfs(x,x,-1,y); //father初始值为-1
}
int ans=-1;
for(int i=n-1;i>=0;i--){
if(w[i]==m){ //遍历每条边,边权为m的输出
ans=i+1;
break;
}
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t=1;
while(t--)
solve();
}
这个答案是正确的,但是比赛时用复杂度较高,运行时间会超时,得不到满分,小白入门看暴力法解决比较易懂