比赛 |
防止浮躁的小练习V0.1 |
评测结果 |
AAAAAAAAAAAAA |
题目名称 |
政党 |
最终得分 |
100 |
用户昵称 |
NVIDIA |
运行时间 |
4.375 s |
代码语言 |
C++ |
内存使用 |
19.48 MiB |
提交时间 |
2016-10-07 18:42:54 |
显示代码纯文本
- #include <algorithm>
- #include <vector>
- #include <iostream>
- #include <queue>
- #include <cstdio>
- #define N 200010
- #define M 20
- using namespace std;
- int n,K;
- vector<int> G[N];
- vector<int> F[N];
- int deep[N]={0};
- int p[N][M]={0};
- bool l[N]={0};
- int o;
- void BFS(int s)
- {
- int i,u,v;
- queue<int> q;
- for(i=1;i<=n;i++)l[i]=0;
- q.push(s);
- while(!q.empty())
- {
- u=q.front();
- q.pop();
- l[u]=1;
- for(i=0;i<G[u].size();i++)
- {
- v=G[u][i];
- if(!l[v])
- {
- p[v][0]=u;
- deep[v]=deep[u]+1;
- q.push(v);
- }
- }
- }
- }
- void LCB(int u)
- {
- int i,v;
- l[u]=1;
- for(i=1;i<M;i++)
- {
- p[u][i]=p[p[u][i-1]][i-1];
- if(!p[u][i])break;
- }
- for(i=0;i<G[u].size();i++)
- {
- v=G[u][i];
- if(!l[v])LCB(v);
- }
- }
- int LCA(int u,int v)
- {
- int i,d,t;
- if(deep[u]<deep[v])
- {
- t=u;
- u=v;
- v=t;
- }
- d=deep[u]-deep[v];
- for(i=0;i<M;i++)if((1<<i)&d)u=p[u][i];
- if(u==v)return u;
- for(i=M-1;i>=0;i--)
- {
- if(p[u][i]!=p[v][i])
- {
- u=p[u][i];
- v=p[v][i];
- }
- }
- u=p[u][0];
- return u;
- }
- int dis(int u,int v)
- {
- int fa,ans=0;
- fa=LCA(u,v);
- ans=deep[u]+deep[v]-2*deep[fa];
- return ans;
- }
- void read()
- {
- int i,j,u,v,w;
- cin>>n>>K;
- for(i=1;i<=n;i++)
- {
- u=i;
- cin>>w>>v;
- F[w].push_back(i);
- if(v==0)continue;
- G[u].push_back(v);
- G[v].push_back(u);
- }
- BFS(1);
- for(i=1;i<=n;i++)l[i]=0;
- LCB(1);
- }
- void make(int s)
- {
- int i,j,u,v;
- int temp=0,best=0,st=0,en=0;
- u=F[s][0];
- for(i=0;i<F[s].size();i++)
- {
- v=F[s][i];
- temp=dis(u,v);
- if(temp>best)
- {
- best=temp;
- st=v;
- }
- }
- best=0;
- for(i=0;i<F[s].size();i++)
- {
- v=F[s][i];
- temp=dis(st,v);
- if(temp>best)
- {
- best=temp;
- en=v;
- }
- }
- cout<<best<<endl;
- }
- void work()
- {
- int i,j;
- for(i=1;i<=K;i++)make(i);
- }
- int main()
- {
- freopen("cowpol.in","r",stdin);
- freopen("cowpol.out","w",stdout);
- read();
- work();
- return 0;
- }