願大地母親保佑你

願大地母親保佑你


題目描述

牛頭人們的生活從來不是和平的。
刺背野豬人、鷹身人等種族經常來騷擾他們,還有一個很欠抽的某巨魔及其麾下的軍隊。
某天,仍然是在彰異牛的注視下,某牛頭人臨危受命,在大地母親的保佑下,拿回了一張圖紙,圖紙上畫的是某巨魔的組織關係示意圖。
這個圖中包含的是某巨魔組織的從屬關係(直屬上級和直屬下級),圖繪製出來後的形態是 N 個點的樹,但是這張圖沒有告訴牛頭人對於一對有從屬關係的巨魔,誰是上級誰是下級。
巨魔中肯定有個最高指揮官(即沒有從屬上級的巨魔),但是牛頭人現在不好判斷哪個巨魔是最高指揮官了。
經過一個牛頭人大德魯伊分析後,得出結論,如果將某個巨魔從這個關係圖中去掉後,這個圖剩下的連通塊中,點數最多那個塊在所有去掉的方案中的點數最少,那麼這個巨魔可能就是最高指揮官。
現在,牛頭人需要你找出一個最高指揮官。


輸入格式

第一行 1 個數字 N
接下來 N1 行,每行兩個數字 AiBi ,表示 Ai 號巨魔和 Bi 號巨魔之間有從屬關係。


輸出格式

輸出一個數字,即巨魔最高指揮官的編號。
如果有多個輸出編號最小的那個。


樣例輸入

3
1 2
2 3


樣例輸出

2


樣例解釋

1 在圖中去掉後,剩下的連通塊點數最多的爲 2 個。
2 在圖中去掉後,剩下的連通塊點數最多的爲 1 個,3 在圖中去掉後,剩下的連通塊點數最多爲 2 個。


數據範圍

20% 的數據 1N1000
100% 的數據 1N106


Solution

首先無向圖轉有向圖;
當一個點被刪掉之後,產生的連通塊有:
一:此點上方的所有點。
二:以此點的每一個兒子爲根的子樹。
然後就可以愉快的打擂臺了。


Code

#include <iostream>
#include <cstdio>
#include <cstring>
#define Max(x,y) ((x)>(y)?(x):(y))
using namespace std;

int n,cnt;

int head[1000010],nxt[2000010],data[2000010],f[2000010],maxn=0x3f3f3f3f,maxt;

void add(int x,int y){
    nxt[cnt]=head[x];data[cnt]=y;head[x]=cnt++;
    nxt[cnt]=head[y];data[cnt]=x;head[y]=cnt++;
}

void dfs(int now,int pre){
    f[now]=1;
    int Maxn=-1;
    for(int i=head[now];i!=-1;i=nxt[i])if(data[i]!=pre){
        dfs(data[i],now);
        f[now]+=f[data[i]];
        Maxn=Max(Maxn,f[data[i]]);
    }
    Maxn=Max(Maxn,n-f[now]);
    if(maxn>Maxn){
        maxn=Maxn;
        maxt=now;
    }
}

int main(){
    freopen("bless.in","r",stdin);
    freopen("bless.out","w",stdout);
    memset(head,-1,sizeof head);
    scanf("%d",&n);
    for(int i=1;i<n;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);
    }
    dfs(1,0);
    printf("%d\n",maxt);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章