Advertisement
Guest User

Untitled

a guest
Nov 29th, 2015
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.84 KB | None | 0 0
  1. import java.util.AbstractMap;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.HashMap;
  5. import java.util.Random;
  6. import java.util.Set;
  7. import java.util.Stack;
  8. import java.util.TreeSet;
  9.  
  10. public class Graf {
  11.     private Integer liczbaWierzcholkow;
  12.     private Integer[][] macierz;
  13.  
  14.     public Graf(final int liczbaWierzcholkow) {
  15.         this.liczbaWierzcholkow = liczbaWierzcholkow;
  16.         this.macierz = initMacierzy(liczbaWierzcholkow);
  17.     }
  18.  
  19.     private Integer[][] initMacierzy(int liczbaWierzcholkow) {
  20.         Integer[][] retVal = new Integer[liczbaWierzcholkow][liczbaWierzcholkow];
  21.  
  22.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  23.             for (int j = 0; j < liczbaWierzcholkow; j++) {
  24.                 retVal[i][j] = 0;
  25.             }
  26.         }
  27.  
  28.         return retVal;
  29.     }
  30.  
  31.     public void dodajKrawedz(Integer od, Integer doo) {
  32.         if (od != doo) {
  33.             macierz[od][doo] = 1;
  34.             macierz[doo][od] = 1;
  35.         }
  36.     }
  37.  
  38.     public void usunKrawedz(Integer od, Integer doo) {
  39.         if (od != doo) {
  40.             this.macierz[od][doo] = 0;
  41.             this.macierz[doo][od] = 0;
  42.         }
  43.     }
  44.  
  45.     public void dodajWierzcholek() {
  46.         Integer[][] tmpMacierz = initMacierzy(liczbaWierzcholkow + 1);
  47.  
  48.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  49.             for (int j = 0; j < liczbaWierzcholkow; j++) {
  50.                 tmpMacierz[i][j] = macierz[i][j];
  51.             }
  52.         }
  53.  
  54.         liczbaWierzcholkow++;
  55.         this.macierz = tmpMacierz;
  56.     }
  57.  
  58.     public void usunWierzcholek(Integer indexWierzcholka) {
  59.         ArrayList<ArrayList<Integer>> tmp = new ArrayList<ArrayList<Integer>>();
  60.  
  61.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  62.             if (i != indexWierzcholka) {
  63.                 tmp.add(new ArrayList<Integer>());
  64.                 for (int j = 0; j < liczbaWierzcholkow - 1; j++) {
  65.                     if (i != 0)
  66.                         tmp.get(i - 1).add(macierz[i - 1][j]);
  67.                     else
  68.                         tmp.get(i).add(macierz[i][j]);
  69.                 }
  70.             }
  71.         }
  72.  
  73.         liczbaWierzcholkow--;
  74.  
  75.         Integer[][] retVal = new Integer[liczbaWierzcholkow][liczbaWierzcholkow];
  76.  
  77.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  78.             for (int j = 0; j < liczbaWierzcholkow; j++) {
  79.                 retVal[i][j] = tmp.get(i).get(j);
  80.             }
  81.         }
  82.  
  83.         macierz = retVal;
  84.     }
  85.  
  86.     public Integer getSopienWierzcholka(int indexWierzcholka) {
  87.         Integer suma = 0;
  88.  
  89.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  90.             if (macierz[indexWierzcholka][i] != 0) {
  91.                 suma++;
  92.             }
  93.         }
  94.  
  95.         return suma;
  96.     }
  97.  
  98.     public Integer getMinStopien() {
  99.         Integer minimum = Integer.MAX_VALUE;
  100.  
  101.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  102.             Integer stopienWierzcholka = this.getSopienWierzcholka(i);
  103.             if (stopienWierzcholka < minimum) {
  104.                 minimum = stopienWierzcholka;
  105.             }
  106.         }
  107.  
  108.         return minimum;
  109.     }
  110.  
  111.     public Integer getMaxStopien() {
  112.         Integer maximum = Integer.MIN_VALUE;
  113.  
  114.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  115.             Integer stopienWierzcholka = this.getSopienWierzcholka(i);
  116.             if (stopienWierzcholka > maximum) {
  117.                 maximum = stopienWierzcholka;
  118.             }
  119.         }
  120.  
  121.         return maximum;
  122.     }
  123.  
  124.     public Integer zliczWierzcholkiStopniaParzystego() {
  125.         Integer suma = 0;
  126.  
  127.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  128.             if (this.getSopienWierzcholka(i) % 2 == 0) {
  129.                 suma++;
  130.             }
  131.         }
  132.  
  133.         return suma;
  134.     }
  135.  
  136.     public Integer zliczWierzcholkiStopniaNieparzystego() {
  137.         Integer suma = 0;
  138.  
  139.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  140.             if (this.getSopienWierzcholka(i) % 2 == 1) {
  141.                 suma++;
  142.             }
  143.         }
  144.  
  145.         return suma;
  146.     }
  147.  
  148.     public Integer[] getCiagStopni() {
  149.         ArrayList<Integer> stopnie = new ArrayList<Integer>();
  150.  
  151.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  152.             stopnie.add(this.getSopienWierzcholka(i));
  153.         }
  154.  
  155.         Collections.reverse(stopnie);
  156.  
  157.         return stopnie.toArray(new Integer[stopnie.size()]);
  158.     }
  159.  
  160.     @Override
  161.     public String toString() {
  162.         StringBuilder s = new StringBuilder();
  163.  
  164.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  165.             for (int j = 0; j < liczbaWierzcholkow; j++) {
  166.                 s.append(macierz[i][j]).append(" ");
  167.             }
  168.             s.append("\n");
  169.         }
  170.  
  171.         return s.toString();
  172.     }
  173.  
  174.     public boolean getC3Naiwnie() {
  175.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  176.             for (int j = 0; j < liczbaWierzcholkow; j++) {
  177.                 if (i != j && macierz[i][j] != 0) {
  178.                     for (int k = 0; k < liczbaWierzcholkow; k++) {
  179.                         if (k != i && j != k && macierz[j][k] != 0) {
  180.                             if (macierz[k][i] != 0) {
  181.                                 return true;
  182.                             }
  183.                         }
  184.                     }
  185.                 }
  186.             }
  187.         }
  188.  
  189.         return false;
  190.     }
  191.  
  192.     public boolean getC3() {
  193.         Integer[][] spotegowanaMacierz = potegaMacierzy();
  194.  
  195.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  196.             for (int j = 0; j < liczbaWierzcholkow; j++) {
  197.                 if (i != j && macierz[i][j] == 1 && spotegowanaMacierz[i][j] >= 1) {
  198.                     return true;
  199.                 }
  200.             }
  201.         }
  202.  
  203.         return false;
  204.     }
  205.  
  206.     public Integer[][] potegaMacierzy() {
  207.         Integer[][] retVal = new Integer[liczbaWierzcholkow][liczbaWierzcholkow];
  208.  
  209.         for (int i = 0; i < liczbaWierzcholkow; i++) {
  210.             for (int j = 0; j < liczbaWierzcholkow; j++) {
  211.                 retVal[i][j] = 0;
  212.                 for (int k = 0; k < liczbaWierzcholkow; k++) {
  213.                     retVal[i][j] += macierz[i][k] * macierz[k][j];
  214.                 }
  215.             }
  216.         }
  217.  
  218.         return retVal;
  219.     }
  220.  
  221.     /*
  222.      *
  223.      * ZADANIE 1
  224.      */
  225.  
  226.     public ArrayList<Integer> getCykl() {
  227.  
  228.         if (liczbaWierzcholkow < 3 && getMinStopien() < 2) {
  229.             System.out.println("Graf nie jest poprawny");
  230.             return null;
  231.         }
  232.  
  233.         for (int pierwszy = 0; pierwszy < liczbaWierzcholkow; pierwszy++) {
  234.             ArrayList<Integer> sciezka = new ArrayList<Integer>();
  235.  
  236.             Integer nieodwiedzony = pierwszy;
  237.             while (nieodwiedzony != null) {
  238.                 sciezka.add(nieodwiedzony);
  239.  
  240.                 nieodwiedzony = getNieodwiedzonyWierzcholek(sciezka);
  241.             }
  242.  
  243.             ArrayList<Integer> sciezkaKopia = (ArrayList<Integer>) sciezka.clone();
  244.  
  245.             while (sciezkaKopia.size() > 2) {
  246.                 if (istniejeKrawedz(sciezkaKopia.get(0), sciezkaKopia.get(sciezkaKopia.size() - 1))) {
  247.                     return sciezkaKopia;
  248.                 }
  249.  
  250.                 sciezkaKopia.remove(sciezkaKopia.size() - 1);
  251.             }
  252.  
  253.             while (sciezka.size() > 2) {
  254.                 if (istniejeKrawedz(sciezka.get(0), sciezka.get(sciezka.size() - 1))) {
  255.                     return sciezka;
  256.                 }
  257.  
  258.                 sciezka.remove(0);
  259.             }
  260.         }
  261.  
  262.         return null;
  263.     }
  264.  
  265.     private Integer getNieodwiedzonyWierzcholek(ArrayList<Integer> sciezka) {
  266.         Integer ostatni = sciezka.get(sciezka.size() - 1);
  267.  
  268.         for (int wierzcholek = 1; wierzcholek < liczbaWierzcholkow; wierzcholek++) {
  269.             if (ostatni != wierzcholek && istniejeKrawedz(ostatni, wierzcholek) && !sciezka.contains(wierzcholek)) {
  270.                 return wierzcholek;
  271.             }
  272.         }
  273.  
  274.         return null;
  275.     }
  276.  
  277.     private boolean istniejeKrawedz(Integer od, Integer doo) {
  278.         return macierz[od][doo] != 0;
  279.     }
  280.  
  281.     /*
  282.      *
  283.      * ZADANIE 3
  284.      */
  285.  
  286.     // glebokosc - wierzcholek
  287.     private HashMap<Integer, ArrayList<Integer>> glebokosciWierzcholkow = new HashMap<Integer, ArrayList<Integer>>();
  288.     // wierzcholek - rodzic
  289.     private HashMap<Integer, Integer> rodziceWierzcholkow = new HashMap<Integer, Integer>();
  290.     // wierzcholek - [aktualny, czyDziecko] niestety tuple w javie sa slabe,
  291.     // uzywam tablicy 2 elementowej
  292.     private HashMap<Integer, Boolean[]> wierzcholkiDominujace = new HashMap<Integer, Boolean[]>();
  293.  
  294.     public ArrayList<Integer> getMinDomZbior() {
  295.         if (liczbaWierzcholkow < 1) {
  296.             System.out.println("Nie prawidlowe drzewo");
  297.             return null;
  298.         }
  299.  
  300.         Integer korzen = wylosujKorzen();
  301.  
  302.         initGrafUkorzeniony(korzen, 0, -1);
  303.  
  304.         return znajdzZbiorDominujacy();
  305.     }
  306.  
  307.     private Integer wylosujKorzen() {
  308.         Random r = new Random();
  309.         return r.nextInt(liczbaWierzcholkow);
  310.     }
  311.  
  312.     private void initGrafUkorzeniony(Integer wierzcholek, Integer glebokosc, Integer rodzic) {
  313.         if (!glebokosciWierzcholkow.containsKey(glebokosc)) {
  314.             glebokosciWierzcholkow.put(glebokosc, new ArrayList<Integer>());
  315.         }
  316.  
  317.         glebokosciWierzcholkow.get(glebokosc).add(wierzcholek);
  318.         rodziceWierzcholkow.put(wierzcholek, rodzic);
  319.         wierzcholkiDominujace.put(wierzcholek, new Boolean[] { false, false });
  320.  
  321.         for (Integer wtmp = 0; wtmp < liczbaWierzcholkow; wtmp++) {
  322.             if (wierzcholek != wtmp && wtmp != rodzic && istniejeKrawedz(wierzcholek, wtmp)) {
  323.                 initGrafUkorzeniony(wtmp, glebokosc + 1, wierzcholek);
  324.             }
  325.         }
  326.     }
  327.  
  328.     private ArrayList<Integer> znajdzZbiorDominujacy() {
  329.         for (int i = glebokosciWierzcholkow.size() - 1; i >= 0; i--) {
  330.             for (int j = 0; j < glebokosciWierzcholkow.get(i).size(); j++) {
  331.                 Integer wierzcholek = glebokosciWierzcholkow.get(i).get(j);
  332.                 Integer rodzic = rodziceWierzcholkow.get(wierzcholek);
  333.  
  334.                 if (!wierzcholkiDominujace.get(wierzcholek)[0] && !wierzcholkiDominujace.get(wierzcholek)[1]) {
  335.                     if (rodzic != -1) {
  336.                         Integer praDziad = rodziceWierzcholkow.get(rodzic);
  337.  
  338.                         // przepisanie pary z wartoscia true dla "aktualny"
  339.                         wierzcholkiDominujace.get(rodzic)[0] = true;
  340.  
  341.                         if (praDziad != -1) {
  342.                             wierzcholkiDominujace.get(praDziad)[1] = true;
  343.                         }
  344.                     } else {
  345.                         wierzcholkiDominujace.get(wierzcholek)[0] = true;
  346.                     }
  347.                 }
  348.             }
  349.         }
  350.  
  351.         ArrayList<Integer> zbiorDominujacy = new ArrayList<Integer>();
  352.         wierzcholkiDominujace.forEach((wierzcholek, dom) -> {
  353.             if (dom[0]) {
  354.                 zbiorDominujacy.add(wierzcholek);
  355.             }
  356.         });
  357.  
  358.         return zbiorDominujacy;
  359.     }
  360.  
  361.     public Stack<Integer> znajdzEulera() {
  362.         Stack<Integer> stos = new Stack<Integer>();
  363.         Stack<Integer> euler = new Stack<Integer>();
  364.         Random r = new Random();
  365.         Integer u = r.nextInt(liczbaWierzcholkow);
  366.         Integer v = null;
  367.         euler.push(u);
  368.  
  369.         do {
  370.             v = getNastepnyWierzcholek(u);
  371.             if (v != null) {
  372.                 stos.push(u);
  373.                 usunKrawedz(u, v);
  374.                 u = v;
  375.             } else {
  376.                 euler.push(stos.pop());
  377.             }
  378.         } while (stos.toArray().length > 0);
  379.  
  380.         return euler;
  381.     };
  382.  
  383.     public Integer getNastepnyWierzcholek(Integer n) {
  384.         for (int j = 0; j < liczbaWierzcholkow; j++) {
  385.             if (macierz[n][j] != 0)
  386.                 return j;
  387.         }
  388.  
  389.         return null;
  390.     }
  391.  
  392.     public Integer getNastepnyWierzcholekNieBedacyWStosieIBedacyWiekszyOdPoprzedniegoZdjetego(Integer n, Stack<Integer> stos,
  393.             Integer poprzedni) {
  394.         for (int j = 0; j < liczbaWierzcholkow; j++) {
  395.             if (!stos.contains(j) && j > poprzedni && macierz[n][j] != 0)
  396.                 return j;
  397.         }
  398.  
  399.         return null;
  400.     }
  401.  
  402.     public Stack<Integer> znajdzHamiltona() {
  403.         Stack<Integer> stos = new Stack<Integer>();
  404.         Random r = new Random();
  405.         Integer v = r.nextInt(liczbaWierzcholkow);
  406.         Integer poprzedniZdjety = -1;
  407.         Integer u = v;
  408.         Integer w = -1;
  409.         stos.push(v);
  410.  
  411.         while (stos.size() < liczbaWierzcholkow) {
  412.             u = stos.lastElement();
  413.  
  414.             if ((w = getNastepnyWierzcholekNieBedacyWStosieIBedacyWiekszyOdPoprzedniegoZdjetego(u, stos, poprzedniZdjety)) != null) {
  415.                 stos.push(w);
  416.             } else {
  417.                 poprzedniZdjety = stos.pop();
  418.             }
  419.         }
  420.  
  421.         return stos;
  422.     }
  423. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement