• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            我希望你是我獨家記憶

            一段永遠封存的記憶,隨風而去
            posts - 263, comments - 31, trackbacks - 0, articles - 3
               :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

            URAL——1056——(樹中心--BFS)

            Posted on 2008-08-21 20:33 Hero 閱讀(294) 評論(0)  編輯 收藏 引用 所屬分類: 代碼如詩--ACM
              1 //    1056    C++    Accepted    0.031    1 045 KB
              2 
              3 //twice BFS 第一次找離節點1最遠的點K,再找離K最遠的點X,
              4 //K--X就是最長鏈,鏈上的中點就是中心 O(n)
              5 
              6 #include <stdio.h>
              7 #include <stdlib.h>
              8 #include <string.h>
              9 
             10 const int size = 10010 ;
             11 struct NODE
             12 {
             13     int en ;
             14     struct NODE * next ;
             15     NODE() { next = NULL ; }
             16 };
             17 struct NODE nhead[size] ;
             18 
             19 struct QUEUE
             20 {
             21     int val ;
             22     int level ;
             23 };
             24 struct QUEUE que[size] ;
             25 int head, tail ;
             26 
             27 int line[size] ;
             28 int flag[size] ;
             29 
             30 int father[size] ;
             31 
             32 int inn ;
             33  
             34 int fmin( int a, int b )
             35 {
             36     return a < b ? a : b ;
             37 }
             38 
             39 int fmax( int a, int b )
             40 {
             41     return a > b ? a : b ;
             42 }
             43 
             44 void input()
             45 {
             46     memset( father, -1sizeof(father) ) ;
             47 
             48     int en ;
             49     forint i=2; i<=inn; i++ ) 
             50     {
             51         scanf( "%d"&en ) ; father[i] = en ;
             52         struct NODE *temp1 = (struct NODE *)malloc( sizeof(NODE) ) ;
             53         temp1->en = en ;
             54         temp1->next = nhead[i].next ; nhead[i].next = temp1 ;
             55         struct NODE *temp2 = (struct NODE *)malloc( sizeof(NODE) ) ;
             56         temp2->en = i ;
             57         temp2->next = nhead[en].next ; nhead[en].next = temp2 ;
             58     }//建圖
             59 }
             60 
             61 void BFS( int sn )
             62 {
             63     memset( flag, 0sizeof(flag) ) ;
             64     que[tail].val = sn ; que[tail++].level = 1 ; flag[sn] = 1 ;
             65 
             66     int curn ; struct NODE *p ;
             67     while( head < tail )
             68     {
             69         curn = que[head].val ;
             70         p = nhead[curn].next ;
             71         while( NULL != p )
             72         {
             73             if0 == flag[p->en] ) 
             74             {
             75                 flag[p->en] = 1 ; 
             76                 que[tail].val = p->en ;
             77                 que[tail++].level = que[head].level + 1 ;
             78             }
             79             p = p->next ;
             80         }
             81         head++ ;//容易忘記
             82     }
             83 }
             84 
             85 void process()
             86 {
             87     head = tail = 0 ; BFS( 1 ) ;
             88 
             89     int leaf = que[tail-1].val ;
             90 
             91     head = tail = 0 ; BFS( leaf ) ;
             92 }
             93 
             94 void output()
             95 {//尋找最長鏈
             96         
             97     line[0= 0 ; int p = tail-1 ;
             98 
             99     int maxlen = que[tail-1].level ; line[maxlen] = que[tail-1].val ;
            100     forint i=maxlen-1; i>=1; i-- )
            101     {
            102         while( que[p].level > i && p>=0 ) p-- ;
            103 
            104         while( father[que[p].val]!=line[i+1]&&father[line[i+1]]!=que[p].val && p>=0 ) p-- ;
            105         line[i] = que[p].val ;
            106     }
            107 
            108     int x = (maxlen+1)/2 ;
            109     if1 == (maxlen&1) )
            110     {
            111         printf( "%d\n", line[x] ) ;
            112     }
            113     else
            114     {
            115         printf( "%d %d\n", fmin( line[x], line[x+1] ), fmax( line[x], line[x+1]) ) ;
            116     }
            117 }
            118 
            119 int main()
            120 {
            121     while( scanf( "%d"&inn ) != EOF )
            122     {
            123         input() ;
            124 
            125         process() ;
            126 
            127         output() ;
            128     }
            129 
            130     return 0 ;
            131 }
            国产精品成人无码久久久久久| 777久久精品一区二区三区无码| 日韩va亚洲va欧美va久久| 久久无码一区二区三区少妇| 无码人妻久久一区二区三区蜜桃 | 欧美黑人又粗又大久久久| 久久亚洲精品成人av无码网站 | 久久久久99精品成人片牛牛影视| 亚洲国产日韩欧美久久| 久久亚洲精品人成综合网| 色播久久人人爽人人爽人人片aV | 久久天天躁狠狠躁夜夜不卡 | 久久影院综合精品| 久久久久久青草大香综合精品| 久久久久久久久波多野高潮| 久久99精品久久久久久hb无码 | 国产精品天天影视久久综合网| 久久久久亚洲AV成人网人人网站 | 丁香狠狠色婷婷久久综合| 久久精品视频一| 久久中文字幕视频、最近更新| 国产成人精品免费久久久久| 狠狠色丁香婷婷久久综合五月| 久久91亚洲人成电影网站| 亚洲精品无码久久千人斩| 色99久久久久高潮综合影院| 热99re久久国超精品首页| 色婷婷综合久久久久中文一区二区| 久久久久99精品成人片三人毛片 | 国产视频久久| 久久精品国产只有精品2020| 亚洲午夜久久久久久噜噜噜| 久久久久99这里有精品10| 一本综合久久国产二区| 国产亚州精品女人久久久久久 | 久久精品国产亚洲av麻豆蜜芽 | 精品熟女少妇AV免费久久| 要久久爱在线免费观看| 久久影视综合亚洲| 欧美久久综合九色综合| 久久中文字幕精品|