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

            M.J的blog

            algorithm,ACM-ICPC
            隨筆 - 39, 文章 - 11, 評(píng)論 - 20, 引用 - 0
            數(shù)據(jù)加載中……

            求樹的直徑

                          樹的直徑是指樹的最長簡單路。求法: 兩遍BFS :先任選一個(gè)起點(diǎn)BFS找到最長路的終點(diǎn),再從終點(diǎn)進(jìn)行BFS,則第二次BFS找到的最長路即為樹的直徑;
                          原理: 設(shè)起點(diǎn)為u,第一次BFS找到的終點(diǎn)v一定是樹的直徑的一個(gè)端點(diǎn)
                          證明: 1) 如果u 是直徑上的點(diǎn),則v顯然是直徑的終點(diǎn)(因?yàn)槿绻鹶不是的話,則必定存在另一個(gè)點(diǎn)w使得u到w的距離更長,則于BFS找到了v矛盾)
                                  2) 如果u不是直徑上的點(diǎn),則u到v必然于樹的直徑相交(反證),那么交點(diǎn)到v 必然就是直徑的后半段了
                                   所以v一定是直徑的一個(gè)端點(diǎn),所以從v進(jìn)行BFS得到的一定是直徑長度

                          相關(guān)題目有TOJ1056,TOJ3517.

            TOJ 1056(Labyrinth):
                    大意是一個(gè)由‘#’和'.'構(gòu)成的迷宮,'.'表示可行,‘#’表示不可行,問可行的最長的路的長度是多少。

            #include <cstdio>
            #include 
            <cstring>
            #include 
            <queue>
            #define M 1002

            using namespace std;

            int r,c;
            char map[M][M];
            bool flag[M][M];
            int move[4][2]={-1,0,1,0,0,-1,0,1};                                               // 分別表示上下左右
            int maxt;
            struct Node{
                    
            int x,y,num;
            };
            Node ans;
            bool legal(int x,int y){                                                                   //判斷該點(diǎn)是否越界及是否可走
                    if(x >=0 && x < r && y>=0 && y < c &&map[x][y]=='.'return true;
                    
            return false;
            }
            void bfs(Node start){
                    memset(flag,
            false,sizeof(flag));                                               //初始所有點(diǎn)標(biāo)記為false
                    flag[start.x][start.y] = true;                                                    //起點(diǎn)標(biāo)記為true
                    queue<Node>f;
                    
            while(!f.empty()) f.pop();                                                       //清空創(chuàng)建的隊(duì)列
                    Node m,n,tep;
                    
            int tx,ty,xx,yy;
                    
            int i,j,k,num;
                    f.push(start);
                    
            while(!f.empty()){                                                                   //如果隊(duì)列不為空
                            m = f.front();                                                                   //取出隊(duì)首元素
                            tx = m.x; ty = m.y; num = m.num;
                            
            if(num > maxt){                                                              //如果該元素的長度大于maxt,更新maxt
                                    maxt = num;
                                    ans 
            = m;
                            }
                            
            for(i = 0;i < 4; i++){                                                       //以m為起點(diǎn)向4個(gè)方向BFS
                                    xx = tx + move[i][0];
                                    yy 
            = ty + move[i][1];
                                    
            if(!flag[xx][yy] && legal(xx,yy)){
                                            flag[xx][yy] 
            = true;
                                            tep.x 
            = xx;
                                            tep.y 
            = yy;
                                            tep.num 
            = num + 1;
                                            f.push(tep);
                                            
            if(num+1>maxt){                                            //如果有更大的則更新
                                                    maxt = num + 1;
                                                    ans 
            = tep;
                                            }
                                    }
                            }
                            f.pop();                                                                              
            //彈出隊(duì)首元素
                    } 
            }
            int main(){
                    
            int i,j,T;
                    Node start,end;
                    
            bool mark;
                    scanf(
            "%d",&T);
                    
            while(T--){
                            scanf(
            "%d%d",&c,&r);
                            mark 
            = false; maxt = -1;
                            
            for(i = 0;i < r; i++)
                                    scanf(
            "%s",map[i]);
                            
            for(i = 0;i < r; i++){
                                    
            for(j = 0;j < c; j++){
                                            
            if(map[i][j]=='.'){                                                     //任選一點(diǎn)BFS
                                                    start.x = i;
                                                    start.y 
            = j;
                                                    start.num 
            = 0;
                                                    bfs(start);
                                                    mark 
            = true;
                                                    
            break;
                                            }
                                    }
                                    
            if(mark) break;
                            }
                            maxt 
            = -1;ans.num = 0;                                                           //此時(shí)ans一定是直徑的端點(diǎn),將它設(shè)為起點(diǎn)
                            bfs(ans);                                                                                    //進(jìn)行第二次BFS
                            printf("Maximum rope length is %d.\n",maxt);
                    }
            }


            TOJ3517(The longest athletic track):
                      題目給出了一棵生成樹,問這棵生成樹最長的路的長度是多少。

            #include<iostream>
            #include
            <queue>
            #define INF 999999
            #define M 2002
            using namespace std;
            int n;
            int maxx;
            int map[M][M],sum[M];
            bool flag[M];
            int bfs(int begin){
                        queue
            <int>f;
                       
            int i,m,k,key;
                        maxx
            =0;
                        memset(flag,
            false,sizeof(flag));
                        f.push(begin);
                       
            while(!f.empty()){
                                    k
            =f.front();
                                    
            for(i=1;i<=n;i++){
                                            
            if(map[k][i]!=INF&&!flag[i]){
                                                        flag[i]
            =true;
                                                        f.push(i);
                                                        sum[i]
            =sum[k]+map[k][i];
                                                        
            if(sum[i]>maxx) { maxx=sum[i];key=i; }
                                             }
                                     }
                                     f.pop();
                        }
                       
            return key;
            }
            int main()
            {
                       
            int i,j,k,dis,key,cas;
                        scanf(
            "%d",&cas);
                       
            while(cas--){
                                     scanf(
            "%d",&n);
                                    
            for(i=1;i<n;i++)
                                              
            for(j=i+1;j<=n;j++)
                                                        map[i][j]
            =map[j][i]=INF;
                                    
            for(i=1;i<n;i++){
                                               scanf(
            "%d%d%d",&j,&k,&dis);
                                               map[j][k]
            =map[k][j]=dis;
                                     }
                                     sum[
            1]=0;
                                     key
            =bfs(1);
                                     sum[key]
            =0;
                                     key
            =bfs(key);
                                     printf(
            "%d\n",maxx);
                         }
                
            //system("pause");
            }





            posted on 2010-07-08 01:14 M.J 閱讀(2656) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久精品夜色噜噜亚洲A∨| 香蕉久久夜色精品升级完成| 一本久久a久久精品亚洲| 九九久久精品国产| 99久久国产热无码精品免费久久久久 | 97久久精品人人澡人人爽| 亚洲中文字幕久久精品无码喷水| 久久免费99精品国产自在现线| 久久青青草原国产精品免费| 99久久综合狠狠综合久久止| 久久亚洲欧美国产精品| 无码国内精品久久人妻蜜桃| 久久综合噜噜激激的五月天| 久久精品国产亚洲av日韩| 99国产精品久久| 一本大道久久a久久精品综合| 麻豆精品久久久一区二区| 国产精品免费久久久久久久久| 91亚洲国产成人久久精品| 久久九九久精品国产| 久久久久99精品成人片| 久久精品国产AV一区二区三区| 久久久久久久久久久久久久 | 久久97久久97精品免视看| 久久久精品日本一区二区三区| 亚洲欧洲中文日韩久久AV乱码| 伊人久久精品无码av一区| 国产国产成人精品久久| 久久精品国产精品亚洲人人| 亚洲αv久久久噜噜噜噜噜| 久久这里只有精品久久| 日本加勒比久久精品| 无码国内精品久久人妻| 久久香蕉综合色一综合色88| 午夜精品久久久久9999高清| 亚洲中文字幕无码久久2017| 狠狠人妻久久久久久综合| 中文字幕久久精品| 久久中文字幕一区二区| 亚洲欧美日韩精品久久亚洲区| 国产精品对白刺激久久久|