<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://m.tkk7.com)原創(chuàng),轉(zhuǎn)載請注明出處.
    主站蜘蛛池模板: 久久精品免费一区二区| 亚洲人成在线播放网站岛国| 在线观看永久免费| 四虎国产精品免费永久在线| 亚洲精品天堂无码中文字幕| 中文字幕在线观看亚洲| 亚洲色无码一区二区三区| 免费一级毛片在播放视频| 免费看国产成年无码AV片| 免费A级毛片av无码| 中文无码日韩欧免费视频| 国产成人+综合亚洲+天堂| 亚洲欧美日韩国产精品一区| 亚洲人成网站日本片| 久久久无码精品亚洲日韩按摩| 亚洲一区二区三区无码中文字幕| 免费一级毛片不卡不收费| 国产精品免费一级在线观看| 久久精品无码一区二区三区免费| 国产成人精品免费午夜app| 国产h肉在线视频免费观看| 最近中文字幕大全中文字幕免费| 玖玖在线免费视频| 日本免费高清视频| 美女在线视频观看影院免费天天看| 国产免费MV大全视频网站| 一级毛片aaaaaa视频免费看| 老司机午夜在线视频免费| 国产亚洲精品精品精品| 亚洲国产成人久久精品软件| 亚洲成av人片天堂网无码】| 亚洲AV无码专区在线电影成人| 亚洲人成电影网站色www| 亚洲熟妇无码八V在线播放| 亚洲精品无码久久| 精品亚洲成A人在线观看青青| 久久久久亚洲国产AV麻豆| 国产亚洲精品第一综合| 好湿好大好紧好爽免费视频| aa级毛片毛片免费观看久| A片在线免费观看|