Problem: Godfather 树的重心

Problem: Godfather 树的重心

Time Limit: 10 Sec Memory Limit: 128 MB

Description

Last years Chicago was full of gangster fights and strange murders. The chief of the police got really tired of all these crimes, and decided to arrest the mafia leaders.
Unfortunately, the structure of Chicago mafia is rather complicated. There are n persons known to be related to mafia. The police have traced their activity for some time, and know that some of them are communicating with each other. Based on the data collected, the chief of the police suggests that the mafia hierarchy can be represented as a tree. The head of the mafia, Godfather, is the root of the tree, and if some person is represented by a node in the tree, its direct subordinates are represented by the children of that node. For the purpose of conspiracy the gangsters only communicate with their direct subordinates and their direct master.
Unfortunately, though the police know gangsters’ communications, they do not know who is a master in any pair of communicating persons. Thus they only have an undirected tree of communications, and do not know who Godfather is.
Based on the idea that Godfather wants to have the most possible control over mafia, the chief of the police has made a suggestion that Godfather is such a person that after deleting it from the communications tree the size of the largest remaining connected component is as small as possible. Help the police to find all potential Godfathers and they will arrest them.
去年芝加哥到处都是黑帮斗殴和奇怪的谋杀案。警察局长对这些罪行真的很厌倦,决定逮捕黑手党领导人。
不幸的是,芝加哥黑手党的结构相当复杂。已知有n人与黑手党有关联。警方追踪他们的活动已有一段时间了,他们知道其中一些人正在互相交流。根据收集到的数据,警察局长建议黑手党的等级可以用树来表示。黑手党的头目教父是这棵树的根,如果有人被树上的一个节点所代表,那么它的直接下属就是这个节点的子节点。为了阴谋的目的,流氓只与他们的直接下属和他们的直接主人交流。
不幸的是,虽然警察知道黑帮的交流,但他们不知道任何一对交流者中谁是主人。因此,他们只有一棵没有方向的交流树,不知道谁是教父。
基于教父想要尽可能控制黑手党的想法,警察局长建议教父是这样一个人,从通讯树中删除后,最大的剩余连接组件的大小尽可能小。帮助警方找到所有可能的教父,他们会逮捕他们。

Input

The first line of the input file contains n — the number of persons suspected to belong to mafia (2 ≤ n ≤ 50 000). Let them be numbered from 1 to n.
The following n − 1 lines contain two integer numbers each. The pair ai, bi means that the gangster ai has communicated with the gangster bi. It is guaranteed that the gangsters’ communications form a tree.
输入文件的第一行包含n-怀疑属于黑手党的人数(2≤n≤50000)。让它们从1到n编号。
以下n-1行中每个包含两个整数。这对组合ai,bi意味着黑帮ai已经与黑帮bi沟通。这保证了匪徒们的交流形成了一棵树。

Output

Print the numbers of all persons that are suspected to be Godfather. The numbers must be printed in the increasing order, separated by spaces.
打印所有被怀疑是教父的人的号码。数字必须按递增顺序打印,并用空格分隔。

Sample Input

6
1 2
2 3
2 5
3 4
3 6

Sample Output

2 3

代码如下

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max(a,b) ((a)>(b)?(a):(b))
int head[50050],vis[50050],n,k,ans[50050],cot,son[50050],size;
struct s {
    int u,v,next;
} edge[50050*2];
int cmp(const void *a,const void *b) {
    return *(int *)a-*(int *)b;
}
void add(int u,int v) {
    edge[cot].u=u;
    edge[cot].v=v;
    edge[cot].next=head[u];
    head[u]=cot++;
}
void dfs(int u) {
    vis[u]=1;
    son[u]=0;
    int temp=0;
    for(int i=head[u]; i!=-1; i=edge[i].next) {
        int v=edge[i].v;
        if(!vis[v]) {
            dfs(v);
            son[u]+=son[v]+1;
            temp=max(temp,son[v]+1);
        }
    }
    temp=max(temp,n-son[u]-1);
    if(temp<size) {
        k=0;
        ans[k++]=u;
        size=temp;
    } else if(temp==size) {
        ans[k++]=u;
    }
}
int main() {
    scanf("%d",&n);
    int i;
    memset(head,-1,sizeof(head));
    cot=0;
    for(i=0; i<n-1; i++) {
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    k=0;
    memset(vis,0,sizeof(vis));
    size=0x7fffffff;
    dfs(1);
    qsort(ans,k,sizeof(ans[0]),cmp);
    printf("%d",ans[0]);
    for(i=1; i<k; i++)
        printf(" %d",ans[i]);
    printf("\n",k);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值