sunfruit[請訪問http://www.fruitres.cn]

          --我相信JAVA能走得更遠 QQ:316228067

          [原創]圖論應用--一筆畫問題

          ??? --sunfruit
          tu1_2.gif
          上圖求一筆畫的路徑,利用圖論的相關知識可以得到程序如下:

          public class OnePath {

          ??? private static int[][]
          ??????????? links = { {0,1,1,0,0,0,1,0}, {1,0,0,1,0,0,0,1}, {1,0,0,1,1,1,0,0},
          ??????????? {0,1,1,0,1,1,0,0}, {0,0,1,1,0,1,1,0}, {0,0,1,1,1,0,0,1}, {1,0,0,0,1,0,0,0}, {0,1,0,0,0,1,0,0}
          ??? };

          ??? public OnePath() {
          ??????? int sum = 0;
          ??????? //存放每個點的度
          ??????? int[] point = new int[links[0].length];
          ??????? for (int i = 0; i < links[0].length; i++) {
          ??????????? int[] templink = links[i];
          ??????????? for (int j = 0; j < links[0].length; j++) {
          ??????????????? point[i] += templink[j];
          ??????????? }
          ??????????? sum += point[i];
          ??????? }

          ??????? //計算度數是奇數點的個數,如果大于2則不能一筆畫
          ??????? int odt = 0;
          ??????? int start = -1;
          ??????? for (int i = 0; i < point.length; i++) {
          ??????????? int mod = point[i] % 2;
          ??????????? if (mod > 0) {
          ??????????????? //if(start==-1)
          ??????????????????? start = i;
          ??????????????? odt++;
          ??????????? }
          ??????? }
          ??????? if(odt>2)
          ??????? {
          ????????? System.out.println("該圖不能一筆畫");
          ????????? return;
          ??????? }
          ??????? int r = 0;
          ??????? //從一個奇數點開始計算
          ??????? int nowd=start;
          ??????? System.out.print(nowd+1);
          ??????? while (sum > 0) {
          ??????????? r=0;
          ??????????? //對于起點nowd 檢查當前的點r 是否合適
          ??????????? //links[nowd][r]==0 判斷是否有可以走的沒有用過的線路
          ??????????? //(point[r]<=1 && sum!=2) 判斷是否是最后一次,如果不是最后一次,那么避開度數是1的點
          ??????????? while (links[nowd][r]==0 || (point[r]<=1 && sum!=2)) {
          ??????????????? r++;
          ??????????? }
          ??????????? links[nowd][r]=0; //已經用過的線路
          ??????????? links[r][nowd]=0; //已經用過的線路 links[nowd][r] links[r][nowd]互為往返路線,用過1->2那么2->1也作廢了
          ??????????? sum=sum-2; //總度數減2 因為從1->2 消耗了1的度和2的度
          ??????????? point[nowd]--; //起點和終點的度都減1 1->2 那么1的度和2的度都減1
          ??????????? point[r]--; //起點和終點的度都減1 1->2 那么1的度和2的度都減1
          ??????????? nowd =r; //設置新的起點
          ??????????? System.out.print("->"+(r+1));
          ??????? }
          ??? }

          ??? public static void main(String[] args) {
          ??????? new OnePath();
          ??? }

          }

          posted on 2006-08-31 14:20 sunfruit 閱讀(947) 評論(0)  編輯  收藏 所屬分類: 數據結構


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 南郑县| 德江县| 霍山县| 阜阳市| 鄂托克前旗| 浦江县| 浮山县| 逊克县| 抚顺市| 宣武区| 惠水县| 兴仁县| 鄢陵县| 商丘市| 密山市| 巴青县| 上虞市| 宜兰市| 蓬溪县| 鸡东县| 丁青县| 石柱| 龙海市| 垫江县| 屏东县| 镶黄旗| 延津县| 谷城县| 乐安县| 开平市| 邛崃市| 曲麻莱县| 壶关县| 淮安市| 涡阳县| 阿拉善盟| 屏东县| 长顺县| 富顺县| 章丘市| 灵寿县|