• <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, 評論 - 20, 引用 - 0
            數據加載中……

            求樹的直徑

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

                          相關題目有TOJ1056,TOJ3517.

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

            #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){                                                                   //判斷該點是否越界及是否可走
                    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));                                               //初始所有點標記為false
                    flag[start.x][start.y] = true;                                                    //起點標記為true
                    queue<Node>f;
                    
            while(!f.empty()) f.pop();                                                       //清空創建的隊列
                    Node m,n,tep;
                    
            int tx,ty,xx,yy;
                    
            int i,j,k,num;
                    f.push(start);
                    
            while(!f.empty()){                                                                   //如果隊列不為空
                            m = f.front();                                                                   //取出隊首元素
                            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為起點向4個方向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();                                                                              
            //彈出隊首元素
                    } 
            }
            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]=='.'){                                                     //任選一點BFS
                                                    start.x = i;
                                                    start.y 
            = j;
                                                    start.num 
            = 0;
                                                    bfs(start);
                                                    mark 
            = true;
                                                    
            break;
                                            }
                                    }
                                    
            if(mark) break;
                            }
                            maxt 
            = -1;ans.num = 0;                                                           //此時ans一定是直徑的端點,將它設為起點
                            bfs(ans);                                                                                    //進行第二次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) 評論(0)  編輯 收藏 引用

            无码人妻精品一区二区三区久久久| 亚洲Av无码国产情品久久| 亚洲午夜精品久久久久久app| 久久午夜综合久久| 久久婷婷国产综合精品| 久久最近最新中文字幕大全| 国产精品九九久久精品女同亚洲欧美日韩综合区| 久久人人添人人爽添人人片牛牛| 一本一道久久综合狠狠老| 97久久综合精品久久久综合| 91久久精品国产免费直播| 久久人人爽人人爽人人爽| 精品久久久久久国产免费了| 亚洲中文字幕无码久久2017| 久久激情亚洲精品无码?V| 色综合久久综合中文综合网| 亚洲国产精品一区二区三区久久| 999久久久无码国产精品| 国产精品一久久香蕉国产线看观看 | 国产高潮国产高潮久久久| 日韩人妻无码一区二区三区久久99| 精品久久久久久无码中文野结衣| 久久精品99久久香蕉国产色戒 | 亚洲国产二区三区久久| 国产午夜免费高清久久影院| 国产精品久久久久影院色| 亚洲中文久久精品无码| 国产精品久久久久9999| 久久久久久久尹人综合网亚洲| 久久国产精品久久精品国产| 国内精品久久久久久久亚洲| 欧美日韩精品久久久久| 久久精品国产亚洲AV高清热| 2022年国产精品久久久久| 亚洲国产婷婷香蕉久久久久久| 亚洲精品白浆高清久久久久久| 狠狠色婷婷久久一区二区三区| 久久精品草草草| 亚洲中文字幕无码久久精品1| 青青热久久国产久精品 | 成人久久精品一区二区三区|