样例过了,喜提0pts ^_^
查看原帖
样例过了,喜提0pts ^_^
1501877
wuzebang2009楼主2025/1/20 21:30
#include<bits/stdc++.h>
using namespace std;
int d[1000010],vis[1000010];
int depth[1000010];
int n,m,t,ans;
vector<int> ver[1000010];
int f[1000010][20];
queue<int> q;

void bfs(){
    q.push(1),depth[1]=1;
    while(q.size()){
        int x=q.front();
        q.pop();
        for(int i=0;i<ver[x].size();i++){
            int v=ver[x][i];
            if(depth[v]) continue;
            f[v][0]=x;
            depth[v]=depth[x]+1;
            for(int j=1;j<=t;j++){
                f[v][j]=f[f[v][j-1]][j-1];
            }
            q.push(v);
        }
    }
}

int lca(int x,int y){
    if(depth[x]>depth[y]) swap(x,y);
    for(int i=t;i>=0;i--){
        if(depth[f[y][i]]>=depth[x]) y=f[y][i];
    }
    if(x==y) return x;
    for(int i=t;i>=0;i--){
        if(f[x][i]!=f[y][i]){
            x=f[x][i],y=f[y][i];
        }
    }
    return f[x][0];
}

void solve(int x){
    vis[x]=1;
    for(int i=0;i<ver[x].size();i++){
        int v=ver[x][i];
        if(vis[v]) continue;
        solve(v);
        d[x]+=d[v];
    }
    if(x==1) return;
    if(d[x]==0){
        ans+=m;
    }
    if(d[x]==1){
        ans+=1;
    }
}

int main(){
    cin>>n>>m;
    t=(int)(log(n)/log(2))+1;
    for(int i=1;i<n;i++){
        int x,y;
        cin>>x>>y;
        ver[x].push_back(y);
        ver[y].push_back(x);
    }
    bfs();
    while(m--){
        int a,b;
        cin>>a>>b;
        int LCA=lca(a,b);
        d[LCA]-=2;
        d[a]++;
        d[b]++;
    }
    solve(1);
    cout<<ans;
}

求调

2025/1/20 21:30
加载中...