cf 324e Xenia and Tree

题目链接 http://codeforces.com/problemset/problem/342/E
题目大意:一棵树上有红色节点和蓝色节点。。初始时节点1为红色节点  然后两种操作 将一个蓝色节点涂成红色节点   操作2 求蓝色节点到红色节点的最短距离
题目分析:倍增算法求lca+bfs   bfs求红色节点到蓝色节点的最短距离 然后每进行100次的操作  bfs一次。。然后套倍增lca的模板就行

#include
#include
#include
#include
#include
#include
#include
#define N 110000
#define CC(x,y) memset(x,y,sizeof(x))
#define inf 0x7ffffff
#define ll long long
#define eps 1e-6
#define M 110000
#define POW 18
using namespace std;
vectorg[N],f;
int p[N][18],fa[N],i,j,k,m,n,x,y,z,dis[N],d[N],vis[N];
queueq;
void DFS(int u,int fa)
{
    d[u]=d[fa]+1;
    p[u][0]=fa;
    for(int i=1;id[b]) a^= b, b^= a, a^= b;
    if(d[a]= 0; i-- )
            if( p[a][i] != p[b][i] )
                 a=p[a][i],b=p[b][i];
        a = p[a][0], b = p[b][0];
    }
    return a;
}
void LCA(int n)
{
    d[1]=0;
    DFS(1,1);
}
void bfs()
{
    CC(vis,0);
    while (!q.empty())q.pop();
    for (i=0;idis[x]+1)
            {
                dis[y]=dis[x]+1;
                if (vis[y]==0)
                q.push(y),vis[y]=1;
            }
        }
    }
    f.clear();
}
int main()
{
    freopen("in.txt","r",stdin);
    scanf("%d%d",&n,&m);
    for (i=1;i



你可能感兴趣的:(cf,图论,lca)