tjut 4912
2016-07-23 22:47
344 查看
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN=111111; struct Edge{ int from,to,next; Edge(){} Edge(int f,int t,int n):from(f),to(t),next(n){} }edge[MAXN*2]; int head[MAXN],tot,fa[MAXN][20],dep[MAXN],q[MAXN],n,m; bool vis[MAXN]; struct Qes{ int u,v,lca; Qes(){} Qes(int _u,int _v,int _fa):u(_u),v(_v),lca(_fa){} bool operator<(const Qes&rhs)const{ return dep[lca]>dep[rhs.lca]; } }qes[MAXN]; void init(){ for(int i=1;i<=n;i++){ head[i]=-1; vis[i]=0; } tot=0; } void add(int f,int t){ edge[tot]=Edge(f,t,head[f]); head[f]=tot++; } void bfs(int root){ int tail=0; q[tail++]=root; fa[root][0]=root;dep[root]=0; for(int i=0;i<tail;i++){ int u=q[i]; for(int i=1;i<20;i++) fa[u][i]=fa[fa[u][i-1]][i-1]; for(int i=head[u];~i;i=edge[i].next){ int v=edge[i].to; if(v==fa[u][0])continue; fa[v][0]=u;dep[v]=dep[u]+1; q[tail++]=v; } } } int Lca(int x,int y){ if(dep[x]<dep[y]){int t=x;x=y;y=t;} for(int i=19;~i;i--) if((dep[x]-dep[y])&(1<<i))x=fa[x][i]; if(x==y)return x; for(int i=19;~i;i--) if(fa[x][i]!=fa[y][i]){x=fa[x][i],y=fa[y][i];} return fa[x][0]; } bool can(int u,int v,int lca){//if u~lca v~lca connected if(vis[u]||vis[v]||vis[lca]) return false; for(;u!=lca;u=fa[u][0]) if(vis[u]) return false; for(;v!=lca;v=fa[v][0]) if(vis[v]) return false; return true; } void cut(int u,int v,int lca){// cut u~lca v~lca for(;u!=lca;u=fa[u][0]) vis[u]=1; for(;v!=lca;v=fa[v][0]) vis[v]=1; vis[lca]=1; } inline bool get(int &a){ char c=0; a=0; do{ c=getchar(); }while(c!=EOF && (c<'0'||c>'9')); if(c==EOF)return false; while('0'<=c && c<='9'){a=a*10-'0'+c;c=getchar();} return true; } inline void ot(int a){ if(a>9) ot(a/10); putchar(a%10+'0'); } int main() { // freopen("data.in","r",stdin); while(get(n)){ get(m); init(); int u,v; for(int i=1;i<n;i++){ get(u); get(v); add(u,v); add(v,u); } bfs(1); for(int i=0;i<m;i++){ get(u); get(v); qes[i]=Qes(u,v,Lca(u,v)); } sort(qes,qes+m); int ans=0; for(int i=0;i<m;i++){ if(can(qes[i].u,qes[i].v,qes[i].lca)){ cut(qes[i].u,qes[i].v,qes[i].lca); ans++; } } ot(ans); putchar('\n'); } return 0; }
相关文章推荐
- [置顶] 实践篇之论机器人的环境感知与智主运动
- 使用Spring的Log4jConfigListener动态加载log4j
- 死锁和避免出现死锁的方式
- HTML5(七)表格-table标签、tr标签、td标签
- maven常用命令
- Chrome开发者工具中关于“Deferred long-running timer task(s) ”的警告
- HDU 1598 find the most comfortable road 并查集+贪心
- 乱头发节(badhair)
- 华为手机不兼容URI的使用问题
- (8)HTML标签详解之<meta>
- 客户反映个人网站服务器慢,作为管理者如何排错解决?
- html5新标签dataList
- python 8位随机密码脚本
- web.xml中webAppRootKey
- BZOJ1603 NOI2008 设计路线 树形dp
- android垃圾回收机制及程序优化System.gc
- 线段树求逆序数
- linx中的信号量
- NKACM1001
- Android -- json数据格式解析练习