<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    春風(fēng)博客

    春天里,百花香...

    導(dǎo)航

    <2008年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    統(tǒng)計

    公告

    MAIL: junglesong@gmail.com
    MSN: junglesong_5@hotmail.com

    Locations of visitors to this page

    常用鏈接

    留言簿(11)

    隨筆分類(224)

    隨筆檔案(126)

    個人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    蔓延法判斷兩個城市的連接狀態(tài)

    這是一個美國IT企業(yè)的面試題,原題大意是從一個文件中讀取出可連通的城市對,給出兩個城市,判斷是否可連通,如果可連通就輸出yes,不可連通就輸出no,否則給出命令行幫助。

    其實判斷連接狀態(tài)不用遍歷圖,用蔓延法即可,具體做法就是從起始城市開始,依次改變其周邊連通城市的連通狀態(tài),再從周邊開始向周邊連通城市蔓延,如果能蔓延到結(jié)束城市的周邊可連通城市,則說明兩個城市是完全可連通的。這種做法和多米諾骨牌效應(yīng)很像。我姑且稱之為蔓延法。

    代碼如下: 

    package com.sitinspring;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.TreeMap;

    /**
     * 城市類
     * 
    @author HEYANG
     * 
    @since 2008-7-24 下午08:38:19
     
    */

    class City{
      
    // 城市名
      String name;
      
    // 可否連通
      boolean isConnected;
      
      
    public City(String name){
        
    this.name=name;
        isConnected
    =false;    
      }

    }


    /**
     * 用蔓延法探測兩個城市的可連通狀態(tài)
     * 
    @author HEYANG
     * 
    @since 2008-7-24 下午09:09:30
     
    */

    public class RoadTestor{
      
    /**
       * 路線圖
       
    */

      
    private Map<String,List<City>> map;
      
      
    /**
       * 構(gòu)造函數(shù)
       *
       
    */

      
    public RoadTestor(){
        map
    =new TreeMap<String,List<City>>();
      }

      
      
    /**
       * 添加兩個城市間的連接
       * 
    @param startCity
       * 
    @param endCity
       
    */

      
    private void addConnRoad(String startCity,String endCity){
        
    if(map.containsKey(startCity)){
          List
    <City> connCities=map.get(startCity);
          connCities.add(
    new City(endCity));
          map.put(startCity,connCities);
        }

        
    else{
          List
    <City> connCities=new ArrayList<City>();
          connCities.add(
    new City(endCity));
          map.put(startCity,connCities);
        }

      }

      
      
    /**
       * 添加雙向道路
       * 
    @param startCity
       * 
    @param endCity
       
    */

      
    public void addRoad(String startCity,String endCity){
        addConnRoad(startCity,endCity);
        addConnRoad(endCity,startCity);
      }

      
      
    /**
       * 打印一個城市及其可連通的周邊城市
       *
       
    */

      
    public void display(){
        
    for(String city:map.keySet()){
          
    // 本城
          System.out.print(city+"通向:");
          
    // 可連通的周邊城
          for(City connCity:map.get(city)){
            System.out.print(connCity.name
    +",");
          }

          
          System.out.println();
        }
       
      }

      
      
    /**
       * 判斷兩城市是否能連通
       * 
    @param startCity
       * 
    @param endCity
       * 
    @return
       
    */

      
    public boolean isConnected(String startCity,String endCity){
        
    // 調(diào)用蔓延法前重置所有城市的連通狀態(tài)
        resetAllCities();
        
        
    // 蔓延法遞歸調(diào)用
        drop(startCity);
        
        
    // 結(jié)束城市周邊可通的城市有一個被蔓延到,則表示該城市可連通
        for(City connCity:map.get(endCity)){
          
    if(connCity.isConnected){
            System.out.println(startCity
    +" 可連通到 "+endCity);
            
    return true;
          }

        }

        
        
    // 都不滿足則表示兩個城市無法連通
        System.out.println(startCity+" 不可連通到 "+endCity);
        
    return false;
      }

      
      
    /**
       * 蔓延法,從一個城市起依次改變周邊城市的可連通狀態(tài)
       * 
    @param cityName
       
    */

      
    private void drop(String cityName){
        
    for(City connCity:map.get(cityName)){
          
    if(connCity.isConnected==false){
            connCity.isConnected
    =true;
            drop(connCity.name);
          }

        }
       
      }

      
      
    /**
       * 重置每個城市的連通狀態(tài)為否,在探測兩城市連通情況前調(diào)用
       
    */

      
    private void resetAllCities(){
        
    for(String city:map.keySet()){
          
    for(City connCity:map.get(city)){
            connCity.isConnected
    =false;
          }
         
        }
     
      }

      
      
    public static void main(String[] args){
        RoadTestor roadMap
    =new RoadTestor();
        
        
    // 我國諸城
        roadMap.addRoad("烏魯木齊""呼和浩特");
        roadMap.addRoad(
    "呼和浩特""北京");
        roadMap.addRoad(
    "北京""大連");
        roadMap.addRoad(
    "北京""西安");    
        roadMap.addRoad(
    "北京""上海");
        roadMap.addRoad(
    "大連""上海");
        roadMap.addRoad(
    "西安""成都");
        roadMap.addRoad(
    "西安""南京");
        roadMap.addRoad(
    "上海""南京");
        roadMap.addRoad(
    "南京""廣州");
        
        
    // 美國諸城
        roadMap.addRoad("舊金山""西雅圖");
        roadMap.addRoad(
    "西雅圖""紐約");
        roadMap.addRoad(
    "亞特蘭大""西雅圖");
        roadMap.addRoad(
    "紐約""北京");// 北京到紐約的航線
        
        
    // 歐洲諸城
        roadMap.addRoad("倫敦""巴黎");
        roadMap.addRoad(
    "巴黎""柏林");
        roadMap.addRoad(
    "柏林""倫敦");
        
    // roadMap.addRoad("倫敦", "上海");// 上海到倫敦的航線

        
    // 展示每個城市和其周邊城市的可連通情況
        roadMap.display();
        
        
    // 依次探測三對城市的連通情況
        roadMap.isConnected("大連""北京");
        roadMap.isConnected(
    "大連""紐約");
        roadMap.isConnected(
    "大連""倫敦");
      }

    }

     

    控制臺輸出:

    上海通向:北京,大連,南京,
    烏魯木齊通向:呼和浩特,
    亞特蘭大通向:西雅圖,
    倫敦通向:巴黎,柏林,
    北京通向:呼和浩特,大連,西安,上海,紐約,
    南京通向:西安,上海,廣州,
    呼和浩特通向:烏魯木齊,北京,
    大連通向:北京,上海,
    巴黎通向:倫敦,柏林,
    廣州通向:南京,
    成都通向:西安,
    舊金山通向:西雅圖,
    柏林通向:巴黎,倫敦,
    紐約通向:西雅圖,北京,
    西安通向:北京,成都,南京,
    西雅圖通向:舊金山,紐約,亞特蘭大,
    大連 可連通到 北京
    大連 可連通到 紐約
    大連 不可連通到 倫敦

     

     

     

    posted on 2008-07-24 21:49 sitinspring 閱讀(1234) 評論(1)  編輯  收藏 所屬分類: 算法數(shù)據(jù)結(jié)構(gòu)

    評論

    # re: 蔓延法判斷兩個城市的連接狀態(tài) 2008-07-25 15:59 Jacky-Q

    這個遞歸寫法好。  回復(fù)  更多評論   

    sitinspring(http://www.tkk7.com)原創(chuàng),轉(zhuǎn)載請注明出處.
    主站蜘蛛池模板: 亚洲人成电影青青在线播放| 91精品免费国产高清在线| 亚洲中文字幕无码av| 亚洲人成色77777| 免费一看一级毛片| 无人在线观看免费高清视频| 久久久久国色av免费看| 人成电影网在线观看免费| 亚洲乱码在线观看| 亚洲伊人久久大香线蕉影院| 无码专区—VA亚洲V天堂| 亚洲天堂免费在线视频| 国产一级一片免费播放i| 久久久www成人免费毛片| 99re6热视频精品免费观看| 中文毛片无遮挡高清免费| 国产精品久久久久久亚洲小说| 中文字幕乱码亚洲精品一区| 亚洲天堂中文字幕在线观看| 亚洲国产第一页www| 国产亚洲综合成人91精品 | 亚洲精品美女久久久久9999| 亚洲午夜福利717| 国产性爱在线观看亚洲黄色一级片 | 69视频免费观看l| 久久99热精品免费观看牛牛| 在线观看免费播放av片| 99re8这里有精品热视频免费| 国产精品极品美女自在线观看免费 | 亚洲乱码中文论理电影| 久久久久亚洲AV片无码下载蜜桃| 亚洲国产成人精品无码区在线观看| 亚洲欧洲日产国码无码久久99| 亚洲性猛交XXXX| 婷婷亚洲久悠悠色悠在线播放| 亚洲第一精品福利| 91亚洲精品麻豆| 亚洲色成人四虎在线观看| 亚洲av无码成人精品区一本二本| 国产综合激情在线亚洲第一页| 无忧传媒视频免费观看入口|