亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mstvisual.java

?? 最小生成樹的算法演示
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
package color;

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.io.IOException;

class Edge {

  public Edge(String sNode, String eNode, int weight) {
    this.sNode = sNode;
    this.eNode = eNode;
    this.weight = weight;
  }

  public Edge() {}

  String sNode;
  String eNode;
  int weight;
}

public class MSTVisual
    extends JPanel
    implements Runnable {
  public MSTVisual() {

    this.setLayout(null);
    process.setBounds(650, 500, 100, 30);

    process.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        //按鈕的事件處理,當點擊時演示生成MST的處理過程
        findMSTEdge = true;
        MST_Process();
        start();
        repaint();
      }
    }
    );

    process.addKeyListener(key);
    this.add(process);
    this.addMouseListener(mouse);
    this.addMouseMotionListener(mouseM);

    this.setBackground(Color.white);

  }

  //演示線程的開始
  public void start() {
    iD = -1;
    main_thread = new Thread(this);
    main_thread.start();
  }

  //演示線程的結束
  public void stop() {
    iD = -1;
    main_thread = null;
  }

  public void run() {
    while (Thread.currentThread() == main_thread) {
      repaint();
      try {
        //延時后繼續選擇下一條邊
        Thread.sleep(1500);
        iD++;
      }
      catch (InterruptedException e) {
        break;
      }
    }
  }

  //MST生成算法
  public void MST_Process() {
    Vector set = new Vector();

    paintResult = false;
    repaint();

    sMSTEdgeV.clear();
    eMSTEdgeV.clear();
    isSelect.clear();
    MST.clear();
    edge.clear();

    for (int i = 0; i < nodeName.size(); i++) {
      Make_set(set, (String) nodeName.get(i));
    }
    /*
         for (int i = 0; i < set.size(); i++) {
      for (int j = 0; j < ( (Vector) set.get(i)).size(); j++) {
        String s = (String) ( ( (Vector) set.get(i)).get(j));
        System.out.println("set " + i + " :  " + s);
      }
         }*/
    for (int i = 0; i < startNode.size() && i < endNode.size(); i++) {
      String s = (String) nodeName.get( ( (Integer) startNode.get(i)).intValue());
      String e = (String) nodeName.get( ( (Integer) endNode.get(i)).intValue());
      int w = ( (Integer) weight.get(i)).intValue();
      edge.add(new Edge(s, e, w));
    }

    Insert_sort(edge);

    /*System.out.println("After sort: ");
         for (int i = 0; i < edge.size(); i++) {
      String s = ( (Edge) edge.get(i)).sNode;
      String e = ( (Edge) edge.get(i)).eNode;
      int w = ( (Edge) edge.get(i)).weight;
      System.out.println("sNode: " + s + "  eNode: " + e + "  weight: " + w);
         }*/

    for (int i = 0; i < edge.size(); i++) {

      String s = ( (Edge) edge.get(i)).sNode;
      String e = ( (Edge) edge.get(i)).eNode;

      int m = Find_set(set, s);
      int n = Find_set(set, e);

      sMSTEdge = nodeName.indexOf(s);
      eMSTEdge = nodeName.indexOf(e);

      sMSTEdgeV.add(new Integer(sMSTEdge));
      eMSTEdgeV.add(new Integer(eMSTEdge));

      nodeName.indexOf(e);
      if (m != n) {
        findMSTEdge = true;
        isSelect.add(new Boolean(true));
        MST.add( (Edge) edge.get(i));
        Union(set, m, n);
      }
      else {
        isSelect.add(new Boolean(false));
      }
    }
    //打印最終的MST
    System.out.println("The mst is: ");
    for (int i = 0; i < MST.size(); i++) {
      String s = ( (Edge) MST.get(i)).sNode;
      String e = ( (Edge) MST.get(i)).eNode;
      int w = ( (Edge) MST.get(i)).weight;

      System.out.println("sNode: " + s + "  eNode: " + e + "  weight: " + w);
    }
  }

  //對各邊以權重的大小排序
  public void Insert_sort(Vector array) {
    int i, j;
    Edge key = new Edge();
    for (j = 1; j < array.size(); j++) {

      key.sNode = ( (Edge) array.get(j)).sNode;
      key.eNode = ( (Edge) array.get(j)).eNode;
      key.weight = ( (Edge) array.get(j)).weight;

      i = j - 1;
      while (i >= 0 && ( (Edge) array.get(i)).weight > key.weight) {
        ( (Edge) array.get(i + 1)).sNode = ( (Edge) array.get(i)).sNode;
        ( (Edge) array.get(i + 1)).eNode = ( (Edge) array.get(i)).eNode;
        ( (Edge) array.get(i + 1)).weight = ( (Edge) array.get(i)).weight;
        i = i - 1;
      }
      ( (Edge) array.get(i + 1)).sNode = key.sNode;
      ( (Edge) array.get(i + 1)).eNode = key.eNode;
      ( (Edge) array.get(i + 1)).weight = key.weight;
    }
  }

  //將各個結點劃分到不同的集合
  public void Make_set(Vector set, String v) {
    Vector temp = new Vector();
    temp.add(v);
    set.add(temp);
  }

  //尋找結點V屬于哪一個集合,并將集合下標返回
  public int Find_set(Vector set, String v) {
    for (int i = 0; i < set.size(); i++) {
      for (int j = 0; j < ( (Vector) set.get(i)).size(); j++) {
        if ( ( (Vector) set.get(i)).get(j) == v) {
          return i;
        }
      }
    }
    return -1;
  }

  //將兩個屬于不同集合的結點連接起來
  public void Union(Vector set, int m, int n) {
    for (int i = 0; i < ( (Vector) set.get(n)).size(); i++) {
      ( (Vector) set.get(m)).add( ( (Vector) set.get(n)).get(i));
    }
    set.remove(n);
  }

  //得到兩個結點的連接位置
  int[] getPaintPosition(int x1, int y1, int x2, int y2) {
    int[] position = {
        x1, y1 + 15, x2, y2 + 15};
    if (x2 > x1 + 60) {
      position[0] = x1 + 30;
      position[1] = y1 + 15;
    }
    else if (x1 > x2 + 60) {
      position[2] = x2 + 30;
      position[3] = y2 + 15;
    }
    else if (x2 <= x1 + 60 || x1 <= x2 + 60) {
      if (y1 < y2) {
        position[0] = x1 + 15;
        position[1] = y1 + 30;
        position[2] = x2 + 15;
        position[3] = y2;
      }
      else {
        position[0] = x1 + 15;
        position[1] = y1;
        position[2] = x2 + 15;
        position[3] = y2 + 30;
      }
    }
    return position;
  }

  //畫圖函數
  public void paintComponent(Graphics g) {
    super.paintComponent(g);

    //對圖中顏色的提示
    g.setColor(Color.black);
    g.drawLine(10, 10, 30, 10);
    g.drawString("圖中原有邊", 35, 15);
    g.setColor(Color.blue);
    g.drawLine(10, 40, 30, 40);
    g.drawString("待選擇邊", 35, 45);
    g.setColor(Color.red);
    g.drawLine(10, 70, 30, 70);
    g.drawString("MST中邊", 35, 75);

    if (drawNode == true) { //畫出各個結點
      for (int i = 0; i < node.size(); i++) {
        g.setColor(Color.lightGray);
        g.fill3DRect( ( (Point) node.get(i)).x, ( (Point) node.get(i)).y, 30,
                     30, true);
        g.setColor(Color.black);
        g.drawString( (String) nodeName.get(i), ( (Point) node.get(i)).x + 12,
                     ( (Point) node.get(i)).y + 18);
      }
    }
    if (drawEdge == true) {
      //畫出各個邊
      g.setColor(Color.black);

      if (findEdge) {
        for (int i = 0; i < startNode.size() && i < endNode.size(); i++) {
          int[] p = getPaintPosition( ( (Point) node.get( ( (Integer) startNode.
              get(i)).intValue())).x,
                                     ( (Point) node.get( ( (Integer) startNode.
              get(i)).intValue())).y,
                                     ( (Point) node.get( ( (Integer) endNode.
              get(i)).intValue())).x,
                                     ( (Point) node.get( ( (Integer) endNode.
              get(i)).intValue())).y);
          g.drawLine(p[0], p[1], p[2], p[3]);
          if (i < weight.size()) {
            g.drawString(String.valueOf( ( (Integer) weight.get(i)).intValue()),
                         (p[0] + p[2]) / 2 + 5,
                         (p[1] + p[3]) / 2 + 5);
          }
        }
      }
      if (hasPre) {
        //如果有了開始結點,畫出從開始結點到鼠標位置之間的直線
        g.setColor(Color.black);
        g.drawLine(preNode.x, preNode.y, currentMousePoint.x,
                   currentMousePoint.y);
      }
    }
    if (brighter == true) {
      //當鼠標經過一個結點時,高亮顯示該結點
      g.setColor(Color.lightGray.brighter());
      g.fill3DRect( ( (Point) node.get(currentNodeIndex)).x,
                   ( (Point) node.get(currentNodeIndex)).y, 30,
                   30, true);
      g.setColor(Color.black);
      g.drawString( (String) nodeName.get(currentNodeIndex),
                   ( (Point) node.get(currentNodeIndex)).x + 12,
                   ( (Point) node.get(currentNodeIndex)).y + 18);
    }
    if (lineBrighter) {
      //當鼠標經過一條邊時,高亮顯示該邊及對應的權重
      g.setColor(Color.green);
      int[] p = getPaintPosition( ( (Point) node.get( ( (Integer) startNode.
          get(currentLineIndex)).intValue())).x,
                                 ( (Point) node.get( ( (Integer) startNode.
          get(currentLineIndex)).intValue())).y,
                                 ( (Point) node.get( ( (Integer) endNode.
          get(currentLineIndex)).intValue())).x,
                                 ( (Point) node.get( ( (Integer) endNode.
          get(currentLineIndex)).intValue())).y);
      g.drawLine(p[0], p[1], p[2], p[3]);
      g.drawString(String.valueOf(weight.get(currentLineIndex)),
                   (p[0] + p[2]) / 2 + 5,
                   (p[1] + p[3]) / 2 + 5);
    }
    if (paintResult) {
      //當算法過程演示已經結束的時候,畫出最終的MST
      g.setColor(Color.red);
      for (int i = 0; i < sMSTEdgeV.size() && i < eMSTEdgeV.size(); i++) {
        if ( ( (Boolean) isSelect.get(i)).booleanValue()) {
          int[] p = getPaintPosition( ( (Point) node.get( ( (Integer)
              sMSTEdgeV.
              get(i)).intValue())).x,
                                     ( (Point) node.get( ( (Integer)
              sMSTEdgeV.
              get(i)).intValue())).y,
                                     ( (Point) node.get( ( (Integer)
              eMSTEdgeV.
              get(i)).intValue())).x,
                                     ( (Point) node.get( ( (Integer)
              eMSTEdgeV.
              get(i)).intValue())).y);
          g.drawLine(p[0], p[1], p[2], p[3]);
        }
      }

    }
    if (findMSTEdge) {

      g.setColor(Color.red);
      if (iD < sMSTEdgeV.size() && iD < eMSTEdgeV.size()) {
        for (int i = 0; i < iD; i++) {
          if ( ( (Boolean) isSelect.get(i)).booleanValue()) {
            //對比當前邊權重小的邊,如果它是MST中的邊,則畫出
            int[] p = getPaintPosition( ( (Point) node.get( ( (Integer)
                sMSTEdgeV.
                get(i)).intValue())).x,
                                       ( (Point) node.get( ( (Integer)
                sMSTEdgeV.
                get(i)).intValue())).y,
                                       ( (Point) node.get( ( (Integer)
                eMSTEdgeV.
                get(i)).intValue())).x,
                                       ( (Point) node.get( ( (Integer)
                eMSTEdgeV.
                get(i)).intValue())).y);
            g.drawLine(p[0], p[1], p[2], p[3]);
          }
        }
        if (iD >= 0) {
          //畫出當前正在選擇邊及對應的權重
          int[] p = getPaintPosition( ( (Point) node.get( ( (Integer) sMSTEdgeV.
              get(iD)).intValue())).x,
                                     ( (Point) node.get( ( (Integer) sMSTEdgeV.
              get(iD)).intValue())).y,
                                     ( (Point) node.get( ( (Integer) eMSTEdgeV.
              get(iD)).intValue())).x,
                                     ( (Point) node.get( ( (Integer) eMSTEdgeV.
              get(iD)).intValue())).y);
          g.setColor(Color.blue);
          g.drawLine(p[0], p[1], p[2], p[3]);
          g.drawString(String.valueOf( ( (Edge) edge.get(iD)).weight),
                       (p[0] + p[2]) / 2 + 5,
                       (p[1] + p[3]) / 2 + 5);
        }
      }
      else {
        findMSTEdge = false;
        paintResult = true;
        repaint();
        stop();
      }
    }
  }

  //boolean delete = false;
  class KeyDown

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天堂成人国产精品一区| 国产欧美日产一区| 日本中文字幕一区| 日韩一区二区三区在线视频| 日韩黄色在线观看| 日韩一二三区不卡| 国产乱子伦一区二区三区国色天香 | 91精品国产品国语在线不卡| 日韩成人伦理电影在线观看| 日韩一区二区影院| 国产成人免费在线视频| 亚洲欧美自拍偷拍色图| 在线免费观看日本欧美| 日韩精品午夜视频| 久久夜色精品国产欧美乱极品| 国产高清不卡二三区| 亚洲欧美在线高清| 欧美久久久久久久久久| 激情小说欧美图片| 中文字幕一区二区三区色视频 | 日韩精品一区二| 成人免费视频一区| 亚洲国产日韩av| 欧美一区中文字幕| 成人听书哪个软件好| 亚洲中国最大av网站| 精品美女在线播放| 在线视频国内自拍亚洲视频| 蜜臀av性久久久久蜜臀aⅴ| 中文字幕国产一区二区| 欧美日韩午夜在线视频| 国产精品18久久久久久久久| 亚洲色图制服丝袜| 精品国产乱码久久久久久夜甘婷婷| 成人午夜看片网址| 美女一区二区三区| 亚洲欧美二区三区| 久久综合久久久久88| 欧美性一级生活| 国产成人福利片| 午夜伦欧美伦电影理论片| 国产欧美综合色| 91精品国产欧美一区二区| 91丝袜美腿高跟国产极品老师| 美脚の诱脚舐め脚责91| 亚洲一区二区三区视频在线播放| 26uuu久久天堂性欧美| 欧美日韩在线播放三区| 成人18视频在线播放| 国产综合久久久久影院| 亚洲国产综合91精品麻豆| 国产精品国产三级国产| 久久久久久日产精品| 在线不卡欧美精品一区二区三区| 成人午夜在线免费| 激情亚洲综合在线| 久久精品国产亚洲一区二区三区| 一二三四社区欧美黄| 国产精品丝袜在线| 精品精品国产高清一毛片一天堂| 欧美三级视频在线观看| 欧美写真视频网站| 91麻豆.com| 成人av午夜电影| 国产精品一区二区久激情瑜伽| 日韩在线一二三区| 亚洲超丰满肉感bbw| 一区二区三区免费观看| 樱桃视频在线观看一区| 国产午夜精品一区二区三区视频 | av在线不卡电影| 粉嫩av一区二区三区在线播放| 久久精品二区亚洲w码| 丝袜美腿一区二区三区| 午夜成人在线视频| 午夜av一区二区| 日韩黄色小视频| 美女一区二区视频| 久久综合综合久久综合| 国内精品久久久久影院色| 激情综合色播五月| 国产福利电影一区二区三区| 国产电影精品久久禁18| 成人午夜电影久久影院| www.在线成人| 色婷婷久久久综合中文字幕| 欧美在线一区二区三区| 欧美日韩精品福利| 日韩午夜电影av| 精品人在线二区三区| 久久久久国产精品麻豆| 欧美国产成人精品| 亚洲精品视频观看| 日韩国产精品久久| 国产美女精品在线| 99精品视频一区二区| 日本国产一区二区| 欧美疯狂性受xxxxx喷水图片| 4438x亚洲最大成人网| 精品国产3级a| 国产精品理论在线观看| 亚洲成人av在线电影| 美女爽到高潮91| 成人av资源在线观看| 色天使久久综合网天天| 欧美一区三区四区| 中文字幕av资源一区| 一区二区久久久| 久久激情五月婷婷| 一本一本久久a久久精品综合麻豆| 欧美日韩精品专区| 日本一区二区三区免费乱视频| 亚洲色图一区二区| 久久国产三级精品| 欧洲亚洲精品在线| www久久久久| 亚洲一区二区在线视频| 国产麻豆视频一区二区| 在线观看视频一区二区欧美日韩| 日韩视频免费直播| 亚洲婷婷国产精品电影人久久| 婷婷成人综合网| 91亚洲精品久久久蜜桃网站| 欧美一区二区三区白人| 国产精品天干天干在线综合| 日韩精品欧美成人高清一区二区| 国产黄人亚洲片| 69av一区二区三区| 国产精品麻豆视频| 男人的天堂久久精品| 91亚洲精华国产精华精华液| 欧美一个色资源| 亚洲综合无码一区二区| 成人自拍视频在线| 欧美zozozo| 亚洲成av人**亚洲成av**| 99热精品国产| 久久久亚洲精品一区二区三区| 一区二区三区四区乱视频| 国产精品99久久久| 精品久久国产97色综合| 亚洲超碰97人人做人人爱| 一本色道久久综合亚洲精品按摩| 久久久国际精品| 麻豆91在线播放免费| 欧美猛男男办公室激情| 亚洲自拍偷拍av| 91国产精品成人| 中文字幕一区二区三中文字幕| 国产伦理精品不卡| 精品福利一区二区三区免费视频| 亚洲bt欧美bt精品| 欧美性感一类影片在线播放| 国产精品灌醉下药二区| 成人精品视频一区| 精品精品国产高清a毛片牛牛| 免费在线看一区| 日韩一区二区三区精品视频| 亚洲成a人v欧美综合天堂下载 | 日本一区二区三区四区| 国产在线播放一区二区三区| 日韩美女视频在线| 蜜桃视频免费观看一区| 91精品久久久久久久91蜜桃| 亚洲成av人**亚洲成av**| 欧美午夜精品一区| 亚洲最新视频在线观看| 欧美制服丝袜第一页| 午夜欧美电影在线观看| 欧美日韩国产综合一区二区| 午夜免费欧美电影| 欧美一级午夜免费电影| 日本不卡一区二区| 久久综合色之久久综合| 国产麻豆9l精品三级站| 国产精品午夜免费| 99精品国产91久久久久久| 亚洲乱码国产乱码精品精98午夜| 91麻豆精品在线观看| 亚洲一二三专区| 欧美日韩精品综合在线| 欧美aⅴ一区二区三区视频| 亚洲国产电影在线观看| 丰满岳乱妇一区二区三区| 国产精品久久久久久妇女6080| www..com久久爱| 亚洲香蕉伊在人在线观| 在线观看91精品国产麻豆| 久久99日本精品| 中文字幕精品—区二区四季| 91老师国产黑色丝袜在线| 性做久久久久久久久| 精品久久国产97色综合| 99久久精品免费看国产| 亚洲一区二区综合| 精品国产成人系列| 91麻豆国产精品久久| 日韩电影一区二区三区| 国产欧美精品日韩区二区麻豆天美| a美女胸又www黄视频久久|