Epso

Graphs

Dec 19th, 2012
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.87 KB | None | 0 0
  1. package MyGraphs;
  2.  
  3. import java.util.Scanner;
  4.  
  5. public class Graphs
  6. {
  7.     byte    destVertex  = 0;
  8.     byte    chain[];
  9.     int     minDist     = 5000;
  10.     boolean flag[];
  11.     long    operationCounter;
  12.     boolean isPrint     = true; // Выводить ли информацию о результатах поиска путей?
  13.  
  14.     /**
  15.      *
  16.      * @param a
  17.      *            - исходный массив. Размер равен размеру массива
  18.      * @param startVertex
  19.      *            - с какой вершины рассматривать
  20.      * @return найденный минимальный путь
  21.      */
  22.     public long bruteForce(int a[][], byte startVertex)
  23.     {
  24.         return bruteForce(a, startVertex, a.length);
  25.     }
  26.  
  27.     /**
  28.      *
  29.      * @param a
  30.      * @param startVertex
  31.      *            - с какой вершины рассматривать
  32.      * @param N
  33.      *            - Размер массива a ( <= a.length)
  34.      * @return найденный минимальный путь
  35.      */
  36.     public long bruteForce(int a[][], byte startVertex, int N)
  37.     {
  38.         operationCounter = 0;
  39.         if (isPrint) System.out.println("\nАлгоритм полного перебора:");
  40.  
  41.         minDist = 5000;
  42.         destVertex = startVertex;
  43.         flag = new boolean[N];
  44.         chain = new byte[N];
  45.         for (int i = 0; i < N; i++)
  46.         {
  47.             flag[i] = false;
  48.             chain[i] = 0;
  49.         }
  50.  
  51.         flag[startVertex] = true;
  52.         doBruteForce(startVertex, 0, a, N);
  53.         flag[startVertex] = false;
  54.  
  55.         if (isPrint) System.out.println("\nМинимальный путь: " + minDist + "\n\nКоличество элементарных операций: " + operationCounter);
  56.         return operationCounter;
  57.  
  58.     }
  59.  
  60.     /**
  61.      * Рекурсивный вызов обхода полным перебором
  62.      *
  63.      * @param vertex
  64.      * @param dist
  65.      * @param a
  66.      * @param N
  67.      */
  68.     private void doBruteForce(byte vertex, int dist, int a[][], int N)
  69.     {
  70.         chain[getCount() - 1] = (byte) (vertex + 1);
  71.  
  72.         if (testFlag() && dist != 0)
  73.             if ((dist + a[vertex][destVertex]) < minDist && a[vertex][destVertex] != 0)
  74.             {
  75.                 minDist = dist + a[vertex][destVertex];
  76.  
  77.                 if (isPrint)
  78.                 {
  79.                     System.out.print("\nПуть: ");
  80.                     printArray(chain);
  81.                     System.out.print("\nВес пути: " + minDist);
  82.                 }
  83.             }
  84.             else
  85.                 ;
  86.         else
  87.             for (byte i = 0; i < N; i++)
  88.             {
  89.                 if (!flag[i] && a[vertex][i] != 0)
  90.                 {
  91.                     flag[i] = true;
  92.                     operationCounter++;
  93.                     doBruteForce(i, dist + a[vertex][i], a, N);
  94.                     flag[i] = false;
  95.                 }
  96.             }
  97.     }
  98.  
  99.     /**
  100.      * Жадный алгоритм поиска кратчайшего пути.
  101.      *
  102.      * @param a
  103.      *            - Исходный массив
  104.      * @param curVertex
  105.      *            - с какой вершины рассматривать обход?
  106.      * @return Найденное расстояние
  107.      */
  108.     public long greedy(int a[][], byte curVertex)
  109.     {
  110.         return greedy(a, curVertex, a.length);
  111.     }
  112.  
  113.     /**
  114.      * Жадный алгоритм поиска кратчайшего пути.
  115.      *
  116.      * @param a
  117.      *            - Исходный массив
  118.      * @param curVertex
  119.      *            - с какой вершины рассматривать обход?
  120.      * @param N
  121.      *            - Какой размер из массива а рассматривать? (<= a.length)
  122.      * @return Найденное расстояние
  123.      */
  124.     public long greedy(int a[][], byte curVertex, int N)
  125.     {
  126.  
  127.         operationCounter = 0;
  128.         if (isPrint) System.out.println("Жадный алгоритм:\n");
  129.  
  130.         int dist = 0;
  131.         byte startVertex = curVertex;
  132.  
  133.         flag = new boolean[N];
  134.         chain = new byte[N];
  135.         byte current = 0;
  136.  
  137.         for (int i = 0; i < N; i++)
  138.         {
  139.             flag[i] = false;
  140.             chain[i] = 0;
  141.         }
  142.  
  143.         flag[curVertex] = true;
  144.         chain[current] = (byte) (curVertex + 1);
  145.  
  146.         for (byte i = 0; i < N - 1; i++)
  147.         {
  148.             byte nextVertex = getMinWay(a, curVertex, N);
  149.             dist += a[curVertex][nextVertex];
  150.             curVertex = nextVertex;
  151.             flag[curVertex] = true;
  152.             current++;
  153.             chain[current] = (byte) (curVertex + 1);
  154.         }
  155.  
  156.         if (isPrint)
  157.         {
  158.             if (a[curVertex][startVertex] != 0)
  159.             {
  160.                 System.out.print("Путь: ");
  161.                 printArray(chain);
  162.                 System.out.print("\nВес: " + (dist + a[curVertex][startVertex]));
  163.                 System.out.print("\nЭлементарных операций: " + operationCounter);
  164.             }
  165.             else
  166.                 System.out.println("\nПолный обход не найден");
  167.         }
  168.         return operationCounter;
  169.     }
  170.  
  171.     private boolean testFlag()
  172.     {
  173.         for (int i = 0; i < flag.length; i++)
  174.             if (!flag[i]) return false;
  175.  
  176.         return true;
  177.     }
  178.  
  179.     /**
  180.      * Возвращает кол-во посещенных вершин в графе. Вызывается алгоритмами поиска путей.
  181.      *
  182.      * @return кол-во пройденных вершин
  183.      */
  184.     private byte getCount()
  185.     {
  186.         byte counter = 0;
  187.         for (int i = 0; i < flag.length; i++)
  188.             if (flag[i]) counter++;
  189.  
  190.         return counter;
  191.     }
  192.  
  193.     /**
  194.      * Поиск соседней непосещенной вершины с наименьшим весом ребра.
  195.      *
  196.      * @param a
  197.      * @param vertex
  198.      * @param N
  199.      * @return Возвращает номер вершины
  200.      */
  201.     private byte getMinWay(int a[][], byte vertex, int N)
  202.     {
  203.         byte minEdge = 127;
  204.         byte minVertex = 0;
  205.  
  206.         for (byte i = 0; i < N; i++)
  207.         {
  208.             operationCounter++;
  209.             if (!flag[i] && a[vertex][i] != 0 && a[vertex][i] < minEdge)
  210.             {
  211.                 minEdge = (byte) a[vertex][i];
  212.                 minVertex = i;
  213.             }
  214.         }
  215.  
  216.         return minVertex;
  217.  
  218.     }
  219.  
  220.     /**
  221.      * Инициализация графа а матрицей смежности. Консольный интерфейс.
  222.      *
  223.      * @param a
  224.      *            - инициализируемый массив
  225.      */
  226.     public void init(int a[][])
  227.     {
  228.         int N = a.length;
  229.  
  230.         for (int i = 0; i < N; i++)
  231.             for (int j = 0; j < N; j++)
  232.             {
  233.                 a[i][j] = 0;
  234.             }
  235.  
  236.         Scanner in = new Scanner(System.in);
  237.  
  238.         System.out.println("Ввод смежных вершин. Введите 0 для перехода к следующей вершине.");
  239.         for (int i = 0; i < N; i++)
  240.         {
  241.             int num = 0; // tmp - номер вершины, w - вес.
  242.             int w = 1;
  243.             do
  244.             {
  245.                 System.out.println("\nВведите смежную вершину для вершины " + (i + 1));
  246.                 num = in.nextInt() - 1;
  247.                 if (num > 0 && num <= N)
  248.                 {
  249.                     System.out.println("Введите вес ребра " + (i + 1) + "-" + (num + 1));
  250.                     w = in.nextInt();
  251.                     a[i][num] = w;
  252.                     a[num][i] = w;
  253.                 }
  254.  
  255.             }
  256.             while (num > 0);
  257.         }
  258.         in.close();
  259.         System.out.println("Конец инициализации графа...");
  260.     }
  261.  
  262.     /**
  263.      * Инициализация массива а с помощью координат на координатной плоскости. Веса вычисляются автоматически.
  264.      *
  265.      * @param a
  266.      */
  267.     public void initByCord(int a[][])
  268.     {
  269.         Scanner in = new Scanner(System.in);
  270.         int N = a.length;
  271.         byte x[] = new byte[N];
  272.         byte y[] = new byte[N];
  273.  
  274.         System.out.println("Кол-во координат: " + N);
  275.         for (int i = 0; i < N; i++)
  276.         {
  277.             System.out.println("Введите координаты (x,y) №" + i);
  278.             x[i] = in.nextByte();
  279.             y[i] = in.nextByte();
  280.         }
  281.  
  282.         for (int i = 0; i < N; i++)
  283.             for (int j = i + 1; j < N; j++)
  284.             {
  285.                 a[i][j] = (int) Math.round(Math.hypot(x[j] - x[i], y[j] - y[i]));
  286.                 a[j][i] = a[i][j];
  287.             }
  288.  
  289.         in.close();
  290.     }
  291.  
  292.     public void initByCordDefault(int[][] a)
  293.     {
  294.         int N = a.length;
  295.         byte x[] = { 0, 4, 1, 15, 15, 18, 8, 3 };
  296.         byte y[] = { 0, 3, 7, 7, 4, 0, 0, 1 };
  297.  
  298.         for (int i = 0; i < N; i++)
  299.             for (int j = i + 1; j < N; j++)
  300.             {
  301.                 a[i][j] = (int) Math.round(Math.hypot(x[j] - x[i], y[j] - y[i]));
  302.                 a[j][i] = a[i][j];
  303.             }
  304.  
  305.     }
  306.  
  307.     public void initDefault(int a[][])
  308.     {
  309.         int b[] = { 0, 2, 0, 4, 0, 3, 2, 0, 2, 0, 0, 5, 0, 2, 0, 4, 2, 3, 4, 0, 4, 0, 1, 2, 0, 0, 2, 1, 0, 2, 3, 5, 3, 2, 2, 0 };
  310.         int counter = 0;
  311.         for (int i = 0; i < a.length; i++)
  312.             for (int j = 0; j < a.length; j++)
  313.             {
  314.                 a[i][j] = b[counter];
  315.                 counter++;
  316.             }
  317.     }
  318.  
  319.     /**
  320.      * Выводит массив a[][] на консоль
  321.      *
  322.      * @param a
  323.      */
  324.     public void printDoubleArray(int a[][])
  325.     {
  326.         for (int i = 0; i < a.length; i++)
  327.         {
  328.             for (int j = 0; j < a.length; j++)
  329.                 System.out.print(a[i][j] + " ");
  330.             System.out.println();
  331.         }
  332.     }
  333.  
  334.     public void printArray(byte[] a)
  335.     {
  336.         for (int i = 0; i < a.length; i++)
  337.             System.out.print(a[i] + " ");
  338.     }
  339.  
  340.     public void printArray(int[] a)
  341.     {
  342.         for (int i = 0; i < a.length; i++)
  343.             System.out.print(a[i] + " ");
  344.     }
  345.  
  346.     public void printTestResult(long a[], String name)
  347.     {
  348.         System.out.println("\n" + name);
  349.         System.out.println("N\tОпераций:");
  350.         for (int i = 0; i < a.length; i++)
  351.         {
  352.             System.out.println((i + 1) + "\t" + a[i]);
  353.         }
  354.     }
  355.  
  356.     public Graphs()
  357.     {
  358.         System.out.println("Class Graphs init...");
  359.     }
  360.  
  361. }
Advertisement
Add Comment
Please, Sign In to add comment