• <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>

            我希望你是我獨家記憶

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

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

            Posted on 2008-08-21 20:33 Hero 閱讀(296) 評論(0)  編輯 收藏 引用 所屬分類: 代碼如詩--ACM
              1 //    1056    C++    Accepted    0.031    1 045 KB
              2 
              3 //twice BFS 第一次找離節(jié)點1最遠(yuǎn)的點K,再找離K最遠(yuǎn)的點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 }
            国产精品99久久久久久猫咪| 久久亚洲中文字幕精品一区| 久久精品免费一区二区三区| 91精品国产91久久久久久蜜臀| 青青草国产97免久久费观看| 麻豆精品久久精品色综合| 久久精品国产乱子伦| 无码国内精品久久人妻| 久久久91人妻无码精品蜜桃HD| 久久99精品国产自在现线小黄鸭| 无码任你躁久久久久久老妇| 久久影视国产亚洲| 丁香色欲久久久久久综合网| 亚洲国产精品久久电影欧美| 佐藤遥希在线播放一二区 | av国内精品久久久久影院| 亚洲国产精品无码久久一线| 久久精品国产亚洲av高清漫画 | www.久久热.com| 国产成人精品综合久久久| 人妻无码αv中文字幕久久琪琪布| 久久久久人妻精品一区三寸蜜桃| 国产香蕉97碰碰久久人人| 免费精品久久天干天干| 日产精品99久久久久久| 免费精品国产日韩热久久| 97久久婷婷五月综合色d啪蜜芽| 久久久久成人精品无码中文字幕| 久久线看观看精品香蕉国产| 精品多毛少妇人妻AV免费久久 | 久久精品无码一区二区三区日韩| 精品久久亚洲中文无码| 久久无码精品一区二区三区| 青青草国产精品久久久久| 久久99国产综合精品女同| 亚洲伊人久久成综合人影院 | 中文国产成人精品久久亚洲精品AⅤ无码精品| 久久有码中文字幕| 欧美伊人久久大香线蕉综合69| 国产精品久久久久久一区二区三区| 综合久久精品色|