当时刚学LCA-tarjan不久,就比赛有这个题,但没想到还是没做出来。。一开始以为是DP来着,没想到是贪心,想想也对,从树的最下层开始,每次遇到询问的点,就找到他们的LCA(路径里面必经LCA),然后把该LCA下的子树连同自己全部染色为不可用了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int N = (+)*;
int u[N],v[N],ft[N],nt[N],cnt;
int dep[N];
vector<int> G[N];
void add(int a,int b)
{
u[cnt]=a;
v[cnt]=b;
nt[cnt]=ft[a];
ft[a]=cnt++;
}
int f[N];
int anc[N];
int vis[N],col[N];
struct edge
{
int a,b,anc,dep;
bool operator < (const edge& rhs) const{
return dep>rhs.dep;
}
}E[N];
int findset(int x)
{
if (x!=f[x]){
f[x]=findset(f[x]);
}
return f[x];
}
int unionset(int a,int b)
{
int r1=findset(a);
int r2=findset(b);
if (r1==r2) return r1;
f[r2]=r1;
return r1;
}
void tarjan(int x,int fa)
{
anc[x]=x;
for (int i=ft[x];i!=-;i=nt[i]){
int nx=v[i];
if (nx==fa) continue;
tarjan(nx,x);
int rt=unionset(x,nx);
anc[rt]=x;
}
col[x]=;
for (int i=;i<G[x].size();i++){
int ii=G[x][i];
int nx=E[ii].a^E[ii].b^x;
if (col[nx]){
E[ii].anc=findset(nx);
E[ii].dep=dep[E[ii].anc]; }
}
}
void dfs1(int x,int fa,int d)
{
dep[x]=d;
for (int i=ft[x];i!=-;i=nt[i]){
int vx=v[i];
if (vx==fa) continue;
dfs1(vx,x,d+);
}
}
void dfs2(int x)
{
vis[x]=;
for (int i=ft[x];i!=-;i=nt[i]){
int vx=v[i];
if (dep[vx]<dep[x] || vis[vx]) continue;
dfs2(vx);
}
}
int main()
{
int n,m,a,b;
while (scanf("%d%d",&n,&m)!=EOF)
{
memset(ft,-,sizeof(ft));
memset(vis,,sizeof(vis));
memset(col,,sizeof(col));
cnt=;
for (int i=;i<n;i++){
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
G[i].clear();
f[i]=i;
}
dfs1(,-,);
G[n].clear();
f[n]=n;
for (int i=;i<m;i++){
scanf("%d%d",&a,&b);
G[a].push_back(i);
G[b].push_back(i);
E[i].a=a;
E[i].b=b;
}
tarjan(,-);
sort(E,E+m);
int ans=;
for (int i=;i<m;i++){
if (!vis[E[i].a] && !vis[E[i].b]){
ans++;
dfs2(E[i].anc);
}
}
printf("%d\n",ans);
}
return ;
}

最新文章

  1. .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]
  2. 解决NTKO Office中文文件名保存到服务器时出现乱码的问题
  3. MongoDB学习笔记~Update方法更新集合属性后的怪问题
  4. Mac OS 后台服务注册
  5. 工欲善其事必先利其器——dreamweaver
  6. TLV简介
  7. 关于在win7内集成usb3.0驱动。
  8. 「2013-9-5」Configure WingIDE for better display of East Asian Glyphs
  9. WindowsPhone-GameBoy模拟器开发五--使用XNA初略实现Gameboy显示系统
  10. (传输层)UDP协议
  11. PHP下利用PHPMailer配合QQ邮箱下的域名邮箱发送邮件(转)
  12. Activity和Fragment生命周期变化
  13. mapreduce框架详解【转载】
  14. shell之变量替换:临时替换
  15. mysql连接不上Uncaught exception &#39;PDOException&#39; with message &#39;could not find driver
  16. Matlab自带常用的分类器,直接复制用就好了,很方面。
  17. Jmeter接口测试实战-数据传递
  18. Markdown语法进阶
  19. 输入一个字母,是元音字母,则输出时元音字母*,否则,输出为辅音字母 (元音字母有:a,e,i,o,u)
  20. C# .net mvc web api 返回 json 内容,过滤值为null的属性

热门文章

  1. Python用户界面编程PyQt5的四种的布局方式
  2. sklearn调用SVM算法
  3. #define 和 const
  4. MariaDB——日志文件
  5. Linux centosVMware shell脚本中的逻辑判断、文件目录属性判断、if特殊用法、case判断
  6. 深度学习Tensorflow框架的安装
  7. Navicat导入json文件到数据库
  8. python绑定调用和非绑定调用
  9. MQTT 协议学习:000-有关概念入门
  10. Python面试2未完待续