东大oj1159 Friends

Problem Description

In a country, the relationship between people can be indicated by a tree. If two people are acquainted with each other, there will be an edge between them. If a person can get in touch with another through no more than five people, we should consider these two people can become friends. Now, give you a tree of N people’s relationship. ( 1 <= N <= 1e5), you should compute the number of who can become friends of each people?

Input

In the first line, there is an integer T, indicates the number of the cases.

For each case, there is an integer N indicates the number of people in the first line.

In the next N-1 lines, there are two integers u and v, indicate the people u and the people v are acquainted with each other directly.

People labels from 1.

Output

For each case, the first line is “Case #k :”, k indicates the case number.

In the next N lines, there is an integer in each line, indicates the number of people who can become the ith person’s friends. i is from 1 to n.

大意是在加♂帕♂里♂大♂草♂原(自我告诫)上,有很多friends,给出两两的friends关系,两个人如果有通过不超过5个人的friends关系,就能成为friends,输出每个人能和多少人成为friends。

没思路,强行写的话就对每个点都搜,多半超时

怕是dp的思想,看了学长的代码后强行理解了...

关键两个转移方程:ch[u][j] += ch[v][j-1],  fa[u][i] = fa[f][i-1] + ch[f][i-1] - ch[u][i-2];

统计ch时是先搜到底,从下往上算;统计fa时一边往下搜一边算,十分机智

算fa的时候根节点特殊处理下

#include<cstdio>
#include<cstring>
const int maxn = 200007;
struct Edge
{
    int v, next;
}E[maxn];
int head[maxn], fa[maxn][10], ch[maxn][10];//fa[i][j]保存从i点向上距离为j的点的数目,ch是向下
int n, cur;
void addedge(int u, int v)
{
    E[cur].v = v;
    E[cur].next = head[u];
    head[u] = cur++;
}
void dfsch(int u, int f)
{
    for(int i = head[u]; ~i; i = E[i].next)
    {
        int v = E[i].v;
        if(v == f)
            continue;
        dfsch(v, u);
        for(int j = 1; j <= 6; j++)
        {
            ch[u][j] += ch[v][j-1];//关键的转移
        }
    }
    ch[u][0] = 1;
}
void dfsfa(int u, int f)
{
    fa[u][0] = 1;
    if(u != f)//根节点特殊处理下
    {
        fa[u][1] = 1;//一个点的父节点只有一个对吧
        for(int i = 2; i <= 6; i++)
        {
            fa[u][i] = fa[f][i-1] + ch[f][i-1] - ch[u][i-2];// 关键的转移
        }
    }
    for(int i = head[u]; ~i; i = E[i].next)
    {
        int v = E[i].v;
        if(v != f)
            dfsfa(v, u);
    }
}
void ini()
{
    memset(head, -1, sizeof(head));
    memset(fa, 0, sizeof(fa));
    memset(ch, 0, sizeof(ch));
    cur = 0;
}
int main()
{
    //freopen("in.txt", "r", stdin);
    int t;
    int kase = 1;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        ini();
        for(int i = 1; i <n; i++)
        {
            int u, v;
            scanf("%d%d", &u, &v);
            addedge(u, v);
            addedge(v, u);
        }
        dfsch(1, 1);
        dfsfa(1, 1);
        printf("Case #%d:\n", kase++);
        for(int i = 1; i <= n; i++)
        {
            int ans = 0;
            for(int j = 1; j <= 6; j++)
            {
                ans += ch[i][j];
                ans += fa[i][j];
            }
            printf("%d\n", ans);
        }
    }
    return 0;
}
时间: 2024-11-05 12:28:52

东大oj1159 Friends的相关文章

东大教务处验证码破解

东北大学教务处编的很烂,一点鼠标键,它就着急拉慌说:"不当的拷贝会损坏您的系统".东大教务处的验证码是最简单的那一种,形同虚设,很易破解. 一.东大教务处验证码特点概述 先上几张图片,. 字符集 a-zA-Z0-9共26+26+10=62个字符 字符位置 四种,如果四个字符一模一样,这四个字符之间的间距是固定的,即第一个与第二个,第二个与第三个,第三个与第四个之间的距离都是一样的. 字符形状 字符形状始终是一样的,不同位置的同一字符可以通过平移来生成. 上面这些规律可以通过大量获取验证

读书笔记-我是如何成功考上东大的

#我这样成功考上东大和哈佛的 “成功学习方程式”由资质 * 策略 * 时间 * 效率所构成的 ##不懂英文也可以考上哈佛 搜集必要信息,制定策略,挤出所有你能想到的学习时间,实践有效率的学习法 ##就算没有语言天分,多少也能学点语言 “成功学习方程式”给我的启示之一,就是了解个人的差异,锻炼自己的资质,也就是先了解自己的优缺点,再制定学习策略##把“成功学习方程式”套用在外语学习上 学外语,只要锻炼“资质”,制订“策略”,确保“时间”,提高“效率”,一定学得好.如果工作繁忙,就采用一天学习一小时

开学&amp;东大一周游记

明天就要离开生活但并没有学到多少东西的东大了,不舍,这是真的,因为真的是没学到多少就要走了.但是终归是有收获的,比如感受到了舍长这样的大牛的学习态度,东大的浴池真的很棒,我很感激吉大的伙食诸如此类.感觉这篇博文要太监了.... 那么就列一个书单吧,顺便立一些FLAG. 数学建模算法与应用&习题解答 高等应用数学问题的MATLAB求解 Linux&Unix内核相关书籍 网络原理相关书籍 概率论&数理统计 统计学 博弈论 数据结构 算法 数值分析 目前想到这些,回头再补充. 至于要立F

东大校园网一键登录

东大校园网很不好用,我在宿舍连着网.当我出去自习的时候,也想用网,就连不上.       因为东大校园网只允许一个人使用,这使得想合伙共用一个账号的人就没法整了.学校这么做多半是为了多挣点钱,这对于一个月只用2,3G的人是一种剥削.既然制度不对,为什么不改呢?       于是只能先断开一下,在重新登陆校园网了.可是坑爹的问题又出现了,有三个按钮:连接,断开连接,断开全部连接.        我点了“断开网络”,然后再“连接网络”,它还告诉我:当前连接数大于一.        实际上,只有一个管

东大金智—飞迈瑞克(Femrice)——四口10G万兆光纤网卡

北京东大金智科技有限公司集技术研发.生产制造.产品行销.综合服务于一体的数据通讯产品解决方案供应商,是一家实力雄厚,集以太网卡.光纤模块.嵌入式开发平台等研发.生产.销售于一体的高新技术企业. 本公司的主营产品均已通过FCC.CE.RoHS等国际权威认证以及国家行业认证.下面为大家介绍四口10G万兆光纤网卡FM-FTXL710BM1-F4. 万兆四口光纤网卡_Intel Xl710芯片 飞迈瑞克FM-FTXL710BM1-F4是一款服务器专用万兆网卡,它具有4个10G的SFP+接口,可支持10G

【项目总结:波士顿东大校友会】CMS栏目个性化设置

开发流程完整实现: 1.实体(entity.model) (截取代码省略setter.getter) /** * 类描述:系统栏目实体 * 创建人:周磊 * 创建时间:2013-8-30 下午03:58:50 */ public class ChannelEntity { /** * 初始化信息 */ public static final String ROOT_NAME = "网站系统栏目"; public static final int ROOT_ID = 0; /** *栏目

XX和OO(南阳oj1159)

XX和OO 时间限制:1000 ms  |  内存限制:65535 KB 难度:0 描述 XXOO 给你一个由X和O组成的串长度不超过80,统计得分. 每个O的得分为目前连续出现O的个数X的得分为0 输入 先输入T 代表有T组测试数据T小于1000 接下来T行串 输出 对于每行串输出得分情况(每次输出占一行) 样例输入 1 OOXXOXXOOO 样例输出 1+2+0+0+1+0+0+1+2+3=10 来源 MLFBM 上传者 ACM_杨明鑫 #include<stdio.h> #include

东大OJ1171题:ACMER的出行计划

Problem Description 众所周知,ACMER经常要到全国各地去参加各种比赛. 每当要出去比赛的时候,我们先要制定一个出行计划,比如说我们是坐飞机还是坐火车,从哪里坐到哪里等等. 现在给你一副路线图,请你制定一个合理的出行计划,由于经费有限,规定最多只能坐k次飞机. Input 第一行给出一个T,表示有T组数据,之后每组数据第一行分别给出n,m,k(n为点数,分别编号为1-n.m为单向边数) 接下来的m行每行分别给出u,v,w,x(u和v分别为两端点编号,方向为u->v.w为费用.

请问重庆东大肛肠医院如何

請問重慶東大肛腸醫院如何?任何疾病都會傷害我們的身體,我們應該多了解這方面的知識,避免危害出現.肛裂的發生在我們的日常生活當中還是比較多見的,那麼我們該怎樣預防肛裂的發生呢?下面跟隨重慶東大肛腸醫院專家一起來了解了解吧. 一.極力治療感染源頭:急性和慢性肛竇炎.肛乳頭炎.內痔和息肉等是引起感染的主要原因.感染的致病菌經腺口進入肛腺,在肛管皮下組織內生成膿腫,破潰後形成潰瘍.小型淺部血栓因感染發生血栓靜脈炎,也可致肛裂發生. 二.預防便秘:肛裂的發病因素中,便秘是大的禍根.專家解釋道,直腸內長期滯