JAVA—咖啡館

          ——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術(shù),交流工作經(jīng)驗,分享JAVA帶來的快樂!本網(wǎng)站部分轉(zhuǎn)載文章,如果有版權(quán)問題請與我聯(lián)系。

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

          圖-傳遞閉包

          圖的傳遞閉包是指修正后的鄰接矩陣表示的圖。(見Graph 圖-鄰接矩陣法 )

          在多個頂點的有向圖中,每個頂點可以到按照方向到達一定的節(jié)點,這叫圖的連通性。有種方法直接告訴我們,圖中的兩個節(jié)點是否可以聯(lián)通,這里說的是WarShall算法。

          WarShall的基本原理是,如果A可以到達B,且C可以到達A,則C可以到達B。通過對鄰接矩陣的修正可以做到這點。隨然這里舉例是將兩步可并成一步,但數(shù)學上可以證明這種修正可以達到任意步驟。

          下面是代碼:

           

           1class WarShall {
           2    private boolean[][] adjMat;
           3
           4    WarShall(int size) {
           5        adjMat = new boolean[size][size];
           6    }

           7
           8    void connect(int from, int to) {
           9        adjMat[from][to] = true;
          10    }

          11
          12    boolean isConnect(int from, int to) {
          13        return adjMat[from][to];
          14    }

          15
          16    void warshall() //warshall算法
          17        for(int y=0; y<adjMat.length; y++//查找每一行
          18            for(int x=0; x<adjMat.length; x++// 查找每個單元格
          19                if(adjMat[y][x])    //如果 y 可以到達 x
          20                    for(int z=0; z<adjMat.length; z++)    //查找所有行的y列
          21                        //如果 z 可以到達y ,說明z 可以直接到達x
          22                        if(adjMat[z][y]) adjMat[z][x] = true;    
          23        
          24    }

          25
          26    boolean[][] getConnections() {
          27        return adjMat;
          28    }

          29
          30    public static void main(String[] args) {
          31        WarShall w = new WarShall(5);
          32        w.connect(0,2);
          33        w.connect(1,0);
          34        w.connect(1,4);
          35        w.connect(3,4);
          36        w.connect(4,2);
          37        for(boolean[] a: w.getConnections()) {
          38            for(boolean b: a) System.out.print(b + " ");
          39            System.out.println();
          40        }

          41        w.warshall();
          42        System.out.println("==================");
          43        for(boolean[] a: w.getConnections()) {
          44            for(boolean b: a) System.out.print(b + " ");
          45            System.out.println();
          46        }

          47
          48        assert w.isConnect(3,2);
          49    }

          50}
          posted on 2008-05-28 15:54 rogerfan 閱讀(941) 評論(0)  編輯  收藏 所屬分類: 【JAVA算法】
          主站蜘蛛池模板: 绩溪县| 将乐县| 平定县| 永福县| 云南省| 临海市| 景泰县| 仪征市| 竹山县| 湖南省| 馆陶县| 盘锦市| 呼玛县| 香河县| 阳曲县| 兰西县| 乌什县| 若尔盖县| 镇雄县| 紫阳县| 余干县| 辽宁省| 贵阳市| 静海县| 都匀市| 黎川县| 察雅县| 保康县| 淄博市| 城固县| 卢湾区| 江门市| 宁夏| 顺昌县| 湖南省| 会泽县| 柯坪县| 旬阳县| 霍城县| 无极县| 图木舒克市|