poj3417 暗的连锁
Posted duojiaming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj3417 暗的连锁相关的知识,希望对你有一定的参考价值。
主体还是求lca啦
看代码
#include<iostream> using namespace std; const int mxn=1e5+5; int n,m; int f[mxn][30],w[mxn*5],d[mxn]; struct vec{ int nxt,to; }g[2*mxn]; int first[mxn],len; void add(int x,int y){ g[++len].to=y; g[len].nxt=first[x]; first[x]=len; } void pre(int u,int fa){ d[u]=d[fa]+1; for(int i=1;i<=19;i++){ f[u][i]=f[f[u][i-1]][i-1]; } for(int i=first[u];i;i=g[i].nxt){ int v=g[i].to; if(v!=fa){ f[v][0]=u; pre(v,u); } } } int lca(int x,int y){ if(d[x]<d[y]){ swap(x,y); } for(int i=19;i>=0;i--){ if(d[f[x][i]]>=d[y]){ x=f[x][i]; } if(x==y){ return x; } } for(int i=19;i>=0;i--){ if(f[x][i]!=f[y][i]){ x=f[x][i]; y=f[y][i]; } } return f[x][0]; } void dfs(int u,int fa){ for(int i=first[u];i;i=g[i].nxt){ int v=g[i].to; if(v!=fa){ dfs(v,u); w[u]+=w[v]; } } } int ans=0; int main(){ cin>>n>>m; int a,b; for(int i=1;i<n;i++){ scanf("%d%d",&a,&b); add(a,b); add(b,a); } pre(1,0); for(int i=1;i<=m;i++){ scanf("%d%d",&a,&b); w[a]++; w[b]++; w[lca(a,b)]-=2; } dfs(1,0); for(int i=2;i<=n;i++){ if(w[i]==1){ ans++; } if(w[i]==0){ ans+=m; } } cout<<ans; return 0; }
以上是关于poj3417 暗的连锁的主要内容,如果未能解决你的问题,请参考以下文章