题目链接:http://codeforces.com/gym/100650

根据给出的树和d,求出一些结点,这些结点形成子树的第d层结点数应该尽量多,具体要求可以参考题目。

dfs一个结点前保存询问深度的答案,访问完以后减去之前的值就得到答案了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = ; vector<string> names;
map<string,int> mp;
int id_cnt;
#define se second
#define MP make_pair int ID(const string & s){
map<string,int>::iterator i = mp.find(s);
if(i != mp.end()) return i->se;
names.push_back(s);
mp.insert(MP(s,id_cnt));
return id_cnt++;
}
int deg[maxn];
int head[maxn],nxt[maxn],to[maxn],ecnt; void addEdge(int u,int v)
{
to[ecnt] = v;
nxt[ecnt] = head[u];
head[u] = ecnt++;
} int pre[maxn*];
int cnt[maxn*];
int deep[maxn]; struct Node
{
int d,id;
bool operator < (const Node & x) const {
return d < x.d || ( d == x.d && names[id] > names[x.id] );
}
}; priority_queue<Node> q; int n,d;
void dfs(int u)
{
cnt[deep[u]]++;
int qd = deep[u]+d;
if(qd < maxn) pre[u] = cnt[qd];
for(int i = head[u]; ~i; i = nxt[i]){
int v = to[i];
deep[v] = deep[u]+;
dfs(v);
}
if(qd<maxn){
int ans = cnt[qd]-pre[u];
if(ans) q.push(Node{ans,u});
}
} void init()
{
names.clear();
mp.clear();
id_cnt = ;
ecnt = ;
memset(deg,,sizeof(deg));
memset(head,-,sizeof(head));
memset(cnt,,sizeof(cnt));
while(q.size()) q.pop();
} char str[]; void read()
{
scanf("%d%d",&n,&d);
while(n--){
int ch; scanf("%s%d",str,&ch);
int fa = ID(str);
while(ch--){
scanf("%s",str);
int v = ID(str);
deg[v]++;
addEdge(fa,v);
}
}
} void topo()
{
int root;
n = mp.size();
for(int i = ; i < n; i++){
if(deg[i] == ) { root = i; break; }
}
deep[root] = ;
dfs(root);
} int main()
{
//freopen("in.txt","r",stdin);
int T; scanf("%d",&T);
for(int kas = ; kas <= T; kas++){
init();
read();
topo();
printf("Tree %d:\n",kas);
for(int i = ; i <= ; i++){
if(q.empty()) break;
Node x = q.top(); q.pop();
printf("%s %d\n",names[x.id].c_str(),x.d);
if(i == ){
int pre = x.d;
while(q.size()){
x = q.top(); q.pop();
if(x.d == pre){
printf("%s %d\n",names[x.id].c_str(),x.d);
}else {
break;
}
}
}
}
if(kas != T) putchar('\n');
}
return ;
}

最新文章

  1. app的自动更新(调用DownloadManager)
  2. 改变了Tomcat路径后无法卸载和重装的解决办法
  3. html5之我見
  4. C#中实现对Excel特定文本的搜索
  5. 配置OpenStack以使用LDAP实现身份管理
  6. Checkbutton 和 Radiobutton
  7. 利用SQL语句产生分组序号
  8. Android 游戏开发 View框架
  9. ios随机数
  10. 网上搜集的一段php可逆加密函数
  11. XMPP系列(一):OpenFire环境搭建
  12. ORACLE 博客文章目录
  13. Dubbo中消费者初始化的过程解析
  14. 开源mall学习
  15. CSS —— 选择器
  16. Java之旅_高级教程_实例_打印图形
  17. redis简单使用
  18. java copy 文件夹
  19. 数据结构实习 - Problem N 树的括号表示法
  20. 更新pip源,提高python下载安装包速度的方式(window及linux)

热门文章

  1. mysql 、redis的区别
  2. HTML5资料整理 [From luics]
  3. python-codecs.open()使用举例
  4. sql #与$的区别
  5. 洛谷 - P3164 - 和谐矩阵 - 高斯约旦消元法
  6. tp5 验证器使用
  7. C\C++书籍
  8. [Xcode 实际操作]八、网络与多线程-(2)使用UIApplication对象打开网页
  9. 【OpenJ_Bailian - 2797】最短前缀(贪心)
  10. web前端篇:JavaScript基础篇(易懂小白上手快)-2