每条额外的边加入到图中,会导致树上一条路径成环,假设没有其余边,那么要将新图分成两部分,如果想删一条成环路径上的边,那么必须把这条额外边也删除。

因此每条额外边加入时,只需将环上的边+1。最后看看每条边被加了几次,被加了x次,也就是说删除这条边,至少还要删除x条边才能被分成两半,如果一次都没有被加,意味着这条边删了就分成两半了,对答案的贡献为m;如果被加了一次,那么对答案的贡献为1;如果被加的次数超过1,那么对答案没有贡献。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
inline int read()
{
char c = getchar(); while(!isdigit(c)) c = getchar();
int x = ;
while(isdigit(c)) { x = x * + c - ''; c = getchar(); }
return x;
} const int maxn=+;
int n,m,cnt,h[maxn],f[maxn];
struct Edge{int to,nx;}e[*maxn];
bool flag[maxn]; void AddEdge(int u,int v)
{
e[cnt].to=v; e[cnt].nx=h[u]; h[u]=cnt++;
} void dfs(int x)
{
flag[x]=;
for(int i=h[x];i!=-;i=e[i].nx)
{
if(flag[e[i].to]) continue;
dfs(e[i].to); f[x]=f[x]+f[e[i].to];
}
} int F[*maxn],B[*maxn],pos[maxn];
int rmq[maxn*][],done; void DFS(int u,int p,int dep)
{
F[++done]=u,B[done]=dep;
pos[u]=done;
for(int son=h[u];son!=-;son=e[son].nx)
{
int v=e[son].to;
if(v==p)continue;
DFS(v,u,dep+);
F[++done]=u,B[done]=dep;
}
} void initRMQ()
{
for(int i=;i<=done;i++)rmq[i][]=i;
for(int j=;(<<j)<=done;j++)
for(int i=;i+(<<j)-<=done;i++)
if(B[rmq[i][j-]]<B[rmq[i+(<<(j-))][j-]])rmq[i][j]=rmq[i][j-];
else rmq[i][j]=rmq[i+(<<(j-))][j-];
} int LCA(int a,int b)
{
a=pos[a],b=pos[b];
if(a>b)swap(a,b);
int k=log(1.0+b-a)/log(2.0);
if(B[rmq[a][k]]<B[rmq[b-(<<k)+][k]])return F[rmq[a][k]];
else return F[rmq[b-(<<k)+][k]];
} int main()
{
scanf("%d%d",&n,&m);
done=cnt=; memset(h,-,sizeof h);
for(int i=;i<n-;i++)
{
int u,v; scanf("%d%d",&u,&v);
AddEdge(u,v); AddEdge(v,u);
}
DFS(,,); initRMQ();
for(int i=;i<=m;i++)
{
int u,v; scanf("%d%d",&u,&v);
f[u]++; f[v]++; f[LCA(u,v)]-=;
}
dfs(); int ans=;
for(int i=;i<=n;i++)
{
if(f[i]==) ans=ans+m;
else if(f[i]==) ans=ans+;
}
printf("%d\n",ans);
return ;
}

最新文章

  1. java代码打包成jar以及转换为exe
  2. LVS+MYCAT+读写分离+MYSQL主备同步部署手册
  3. ASO优化总结(基于网络分享的知识总结归纳)
  4. C语言字符串匹配函数
  5. 浏览器检测是否安装flash插件,若没有安装,则弹出安装提示
  6. NDK开发之Application.mk文件详解
  7. 【搜索引擎Jediael开发笔记3】使用HtmlParser提取网页中的链接
  8. 在SQL Server中对视图进行增删改
  9. java多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
  10. SVN简明课程
  11. UNIX/Linux C 程序员需要掌握的七种武器
  12. 用Laravel Sms实现 laravel短信验证码的发送
  13. 一小时学会ECMAScript6新特性(一)
  14. R语言查看栅格值
  15. jRebel与xRebel的使用
  16. mysql导入自定义函数不成功的解决方法
  17. 使用Mongoose类库实现简单的增删改查
  18. [微软官网]windows server 内存限制
  19. Python全栈问答小技巧_2
  20. fiddler模拟timeout超时场景

热门文章

  1. extjs中,datefield日期,点击输入框弹出日期,禁止手动输入
  2. 【转】CSS
  3. 查看Windows支持的内存大小
  4. webuploader限制只上传图片文件
  5. mysql修改编码
  6. iOS7之后的文本高度封装
  7. java链接mysql添加中文和模糊查询
  8. Python简记
  9. python学习day2
  10. python之~【空格】可不能随便加唷~