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);
}
posted @ 2019-01-28 11:14  ZhaoChongyan  阅读(162)  评论(0编辑  收藏  举报