记录编号 428637 评测结果 AAAAAAAAA
题目名称 暗之链锁 最终得分 100
用户昵称 Gravatar天亮说晚安· 是否通过 通过
代码语言 C++ 运行时间 0.426 s
提交时间 2017-07-25 21:28:22 内存使用 7.56 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define maxn 100005
using namespace std;
 
int n,m,head[maxn*3],fb[maxn],f[maxn];
int top[maxn],x,y,dep[maxn],dis[maxn*3],size;
long long ans;
struct node{
    int from,to,next;       
}edge[maxn*3];
void add(int from,int to){
    edge[++size].from=from;
    edge[size].to=to;
    edge[size].next=head[from];
    head[from]=size;     
}

void dfs(int x,int fa){
    f[x]=fa;
    for(int i=head[x];i;i=edge[i].next){
         int to=edge[i].to;        
         if(to==fa)   continue;
         fb[to]=i;
         dep[to]=dep[x]+1;
         dfs(to,x); 
    }     
}
 
void Jia(int x,int y){
     while(x!=y){
         if(dep[x]<dep[y])  swap(x,y);
         dis[fb[x]]++;
         x=f[x];             
     }     
}
 
void dp(int x){
    for(int i=head[x];i;i=edge[i].next){
          if(edge[i].to==f[x])  continue;
          if(dis[i]==1)
             ans++;
          else  if(!dis[i])  ans+=m;
          dp(edge[i].to);      
    }     
}
 
int main(){
freopen("yam.in","r",stdin);
freopen("yam.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        add(x,y);add(y,x);        
    }
    dfs(1,0);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        Jia(x,y);    
    }
    dp(1);
    printf("%ld",ans);
}