sunfruit[請(qǐng)?jiān)L問http://www.fruitres.cn]

          --我相信JAVA能走得更遠(yuǎn) QQ:316228067

          [原創(chuàng)]圖論應(yīng)用--一筆畫問題

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

          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;
          ??????? //存放每個(gè)點(diǎn)的度
          ??????? 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];
          ??????? }

          ??????? //計(jì)算度數(shù)是奇數(shù)點(diǎn)的個(gè)數(shù),如果大于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;
          ??????? //從一個(gè)奇數(shù)點(diǎn)開始計(jì)算
          ??????? int nowd=start;
          ??????? System.out.print(nowd+1);
          ??????? while (sum > 0) {
          ??????????? r=0;
          ??????????? //對(duì)于起點(diǎn)nowd 檢查當(dāng)前的點(diǎn)r 是否合適
          ??????????? //links[nowd][r]==0 判斷是否有可以走的沒有用過(guò)的線路
          ??????????? //(point[r]<=1 && sum!=2) 判斷是否是最后一次,如果不是最后一次,那么避開度數(shù)是1的點(diǎn)
          ??????????? while (links[nowd][r]==0 || (point[r]<=1 && sum!=2)) {
          ??????????????? r++;
          ??????????? }
          ??????????? links[nowd][r]=0; //已經(jīng)用過(guò)的線路
          ??????????? links[r][nowd]=0; //已經(jīng)用過(guò)的線路 links[nowd][r] links[r][nowd]互為往返路線,用過(guò)1->2那么2->1也作廢了
          ??????????? sum=sum-2; //總度數(shù)減2 因?yàn)閺?->2 消耗了1的度和2的度
          ??????????? point[nowd]--; //起點(diǎn)和終點(diǎn)的度都減1 1->2 那么1的度和2的度都減1
          ??????????? point[r]--; //起點(diǎn)和終點(diǎn)的度都減1 1->2 那么1的度和2的度都減1
          ??????????? nowd =r; //設(shè)置新的起點(diǎn)
          ??????????? System.out.print("->"+(r+1));
          ??????? }
          ??? }

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

          }

          posted on 2006-08-31 14:20 sunfruit 閱讀(953) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)結(jié)構(gòu)


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 平乐县| 布拖县| 廉江市| 上杭县| 灵丘县| 大宁县| 施秉县| 乾安县| 江安县| 贵定县| 朝阳县| 景洪市| 夏河县| 台安县| 孟津县| 松桃| 海丰县| 湘西| 元氏县| 庐江县| 平湖市| 全椒县| 清水河县| 南宫市| 房产| 凯里市| 济南市| 沁源县| 新龙县| 东台市| 黔东| 黄冈市| 开原市| 黑水县| 兴和县| 庆云县| 蒙山县| 华池县| 永济市| 东乌珠穆沁旗| 子长县|