Advertisement
Guest User

Untitled

a guest
May 30th, 2015
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.62 KB | None | 0 0
  1. package prax6Ott;
  2. import java.util.*;
  3.  
  4.  
  5. /**
  6. * @author OTTMAC
  7. * Holds sub-classes like Graph, Vertex, Edge, Sageuds and Andmed and method calculatePryfer.
  8. */
  9. public class GraphTask {
  10.  
  11. public static void main (String[] args) {
  12. GraphTask a = new GraphTask();
  13. a.run();
  14. //throw new RuntimeException ("Nothing implemented yet!"); // delete this
  15. }
  16.  
  17. /**
  18. * @author OTTMAC
  19. * @purpose: to create different graphs and call out Pryfer sequence method.
  20. */
  21. public void run() {
  22.  
  23. // TODO!!! YOUR TESTS HERE!
  24. // //kahe elemendiga graafi test
  25. // Graph g = new Graph ("G");
  26. // Vertex kaheksa = new Vertex("8");
  27. // Vertex seitse = new Vertex("7");
  28. // Edge kaheksaSeitse = new Edge("87");
  29. // g.first = kaheksa;
  30. // kaheksa.first = kaheksaSeitse;
  31. // kaheksaSeitse.target = seitse;
  32. // kaheksa.next = seitse;
  33. // seitse.next = null;
  34.  
  35.  
  36. // //�he elemendiga graafi test
  37. // Graph g = new Graph("G");
  38. // Vertex kaheksa = new Vertex("8");
  39. // g.first = kaheksa;
  40. //t�htedega graafi test
  41. Graph g = new Graph ("G");
  42. Vertex kaheksa = new Vertex ("H");
  43. Vertex seitse = new Vertex ("G");
  44. Vertex kuus = new Vertex ("F");
  45. Vertex viis = new Vertex ("E");
  46. Vertex neli = new Vertex ("D");
  47. Vertex kolm = new Vertex ("C");
  48. Vertex kaks = new Vertex ("B");
  49. Vertex yks = new Vertex ("A");
  50. Edge lisaTest1 = new Edge("98");
  51. Vertex yheksa= new Vertex("9");;
  52. yheksa.first = lisaTest1;
  53. lisaTest1.target = kaheksa;
  54. g.first = yheksa;
  55. Edge kaheksaViis = new Edge ("85");
  56. Edge viisKolm = new Edge ("53");
  57. Edge kolmSeitse = new Edge ("37");
  58. Edge kolmYks = new Edge ("31");
  59. Edge yksNeli = new Edge ("14");
  60. Edge yksKaks = new Edge ("12");
  61. Edge kaksKuus = new Edge ("26");
  62. kaheksa.first = kaheksaViis;
  63. viis.first = viisKolm;
  64. kolm.first = kolmYks;
  65. kolmYks.next = kolmSeitse;
  66. yks.first = yksKaks;
  67. yksKaks.next = yksNeli;
  68. kaks.first = kaksKuus;
  69. kaheksaViis.target = viis;
  70. viisKolm.target = kolm;
  71. kolmYks.target = yks;
  72. kolmSeitse.target = seitse;
  73. yksKaks.target = kaks;
  74. yksNeli.target = neli;
  75. kaksKuus.target = kuus;
  76.  
  77. //pandud n� 'arraysse'
  78. yheksa.next = kaheksa;
  79. kaheksa.next = seitse;
  80. seitse.next = kuus;
  81. kuus.next = viis;
  82. viis.next = neli;
  83. neli.next = kolm;
  84. kolm.next = kaks;
  85. kaks.next = yks;
  86. yks.next = null;
  87.  
  88.  
  89. //t�htedega graaf upper-lower-segamini
  90. // Graph g = new Graph ("G");
  91. // Vertex kaheksa = new Vertex ("H");
  92. // Vertex seitse = new Vertex ("g");
  93. // Vertex kuus = new Vertex ("f");
  94. // Vertex viis = new Vertex ("e");
  95. // Vertex neli = new Vertex ("D");
  96. // Vertex kolm = new Vertex ("c");
  97. // Vertex kaks = new Vertex ("b");
  98. // Vertex yks = new Vertex ("A");
  99. // Edge lisaTest1 = new Edge("98");
  100. // Vertex yheksa= new Vertex("9");;
  101. // yheksa.first = lisaTest1;
  102. // lisaTest1.target = kaheksa;
  103. // g.first = yheksa;
  104. // Edge kaheksaViis = new Edge ("85");
  105. // Edge viisKolm = new Edge ("53");
  106. // Edge kolmSeitse = new Edge ("37");
  107. // Edge kolmYks = new Edge ("31");
  108. // Edge yksNeli = new Edge ("14");
  109. // Edge yksKaks = new Edge ("12");
  110. // Edge kaksKuus = new Edge ("26");
  111. // kaheksa.first = kaheksaViis;
  112. // viis.first = viisKolm;
  113. // kolm.first = kolmYks;
  114. // kolmYks.next = kolmSeitse;
  115. // yks.first = yksKaks;
  116. // yksKaks.next = yksNeli;
  117. // kaks.first = kaksKuus;
  118. // kaheksaViis.target = viis;
  119. // viisKolm.target = kolm;
  120. // kolmYks.target = yks;
  121. // kolmSeitse.target = seitse;
  122. // yksKaks.target = kaks;
  123. // yksNeli.target = neli;
  124. // kaksKuus.target = kuus;
  125. //
  126. // //pandud n� 'arraysse'
  127. // yheksa.next = kaheksa;
  128. // kaheksa.next = seitse;
  129. // seitse.next = kuus;
  130. // kuus.next = viis;
  131. // viis.next = neli;
  132. // neli.next = kolm;
  133. // kolm.next = kaks;
  134. // kaks.next = yks;
  135. // yks.next = null;
  136. //
  137. // //Numbriline graaf 1-st 6ni
  138. // Graph g = new Graph("G");
  139. // Vertex yks = new Vertex("1");
  140. // Vertex kaks = new Vertex("2");
  141. // Vertex kolm = new Vertex("3");
  142. // Vertex neli = new Vertex("4");
  143. // Vertex viis = new Vertex("5");
  144. // Vertex kuus = new Vertex("6");
  145. // Edge kuusViis = new Edge("65");
  146. // Edge viisNeli = new Edge("54");
  147. // Edge neliKolm = new Edge("43");
  148. // Edge neliKaks = new Edge("42");
  149. // Edge neliYks = new Edge("41");
  150. // //seosed
  151. // g.first = kuus;
  152. // kuus.first = kuusViis;
  153. // kuusViis.target = viis;
  154. //
  155. // viis.first = viisNeli;
  156. // viisNeli.target = neli;
  157. //
  158. // neli.first = neliKolm;
  159. // neliKolm.target = kolm;
  160. //
  161. // neliKolm.next = neliKaks;
  162. // neliKaks.target = kaks;
  163. //
  164. // neliKaks.next = neliYks;
  165. // neliYks.target = yks;
  166. //
  167. // kuus.next = viis;
  168. // viis.next = neli;
  169. // neli.next = kolm;
  170. // kolm.next = kaks;
  171. // kaks.next = yks;
  172. // yks.next = null;
  173.  
  174. //numbritega graafi test
  175. // Graph g = new Graph ("G");
  176. // Vertex kaheksa = new Vertex ("8");
  177. // Vertex seitse = new Vertex ("7");
  178. // Vertex kuus = new Vertex ("6");
  179. // Vertex viis = new Vertex ("5");
  180. // Vertex neli = new Vertex ("4");
  181. // Vertex kolm = new Vertex ("3");
  182. // Vertex kaks = new Vertex ("2");
  183. // Vertex yks = new Vertex ("1");
  184. // Edge lisaTest1 = new Edge("98");
  185. // Vertex yheksa= new Vertex("9");;
  186. // yheksa.first = lisaTest1;
  187. // lisaTest1.target = kaheksa;
  188. // g.first = yheksa;
  189. // Edge kaheksaViis = new Edge ("85");
  190. // Edge viisKolm = new Edge ("53");
  191. // Edge kolmSeitse = new Edge ("37");
  192. // Edge kolmYks = new Edge ("31");
  193. // Edge yksNeli = new Edge ("14");
  194. // Edge yksKaks = new Edge ("12");
  195. // Edge kaksKuus = new Edge ("26");
  196. // kaheksa.first = kaheksaViis;
  197. // viis.first = viisKolm;
  198. // kolm.first = kolmYks;
  199. // kolmYks.next = kolmSeitse;
  200. // yks.first = yksKaks;
  201. // yksKaks.next = yksNeli;
  202. // kaks.first = kaksKuus;
  203. // kaheksaViis.target = viis;
  204. // viisKolm.target = kolm;
  205. // kolmYks.target = yks;
  206. // kolmSeitse.target = seitse;
  207. // yksKaks.target = kaks;
  208. // yksNeli.target = neli;
  209. // kaksKuus.target = kuus;
  210. //
  211. // //pandud n� 'arraysse'
  212. // yheksa.next = kaheksa;
  213. // kaheksa.next = seitse;
  214. // seitse.next = kuus;
  215. // kuus.next = viis;
  216. // viis.next = neli;
  217. // neli.next = kolm;
  218. // kolm.next = kaks;
  219. // kaks.next = yks;
  220. // yks.next = null;
  221. ArrayList<String> andmed = calculatePryfer(g.first);
  222. System.out.println("Graphs Vertexes and edges connected to it.");
  223. System.out.println(g);
  224. System.out.println("Unique pryfer sequence of this graph:");
  225. for(int i = 0 ; i<andmed.size(); i++){ System.out.print(andmed.get(i) + " ");}
  226. //System.out.println (g);
  227. }
  228.  
  229.  
  230. /**
  231. * @author OTTMAC
  232. * @purpose: to hold a Graph's Vertex information. Vertex name (id), next vertex (next) and first 'child' of the current vertex (edge first)
  233. * @variable Vertex id: Vertex name.
  234. * @variable Edge first : First Edge of this Vertex. Allows to describe a child of current Vertex.
  235. * @variable Vertex next : Next Vertex. Used to hold all Graphs Vertexes in a Graph.
  236. */
  237. class Vertex {
  238.  
  239. String id;
  240. Vertex next;
  241. Edge first;
  242. /**
  243. * Class constructor with three inputs. Creates a Vertex object.
  244. */
  245. Vertex (String s, Vertex v, Edge e) {
  246. id = s;
  247. next = v;
  248. first = e;
  249. }
  250. /**
  251. * Class constructor with one input. Creates a Vertex object
  252. */
  253. Vertex (String s) {
  254. this (s, null, null);
  255. }
  256.  
  257. @Override
  258. public String toString() {
  259. return id;
  260. }
  261.  
  262. // TODO!!! Your Vertex methods here!
  263.  
  264. } // Vertex
  265.  
  266.  
  267. /**
  268. * @author OTTMAC
  269. * @purpose to create an edge with according data - id, target (another vertex) and 'next' edge, which is an edge on the same level.
  270. * @variable String id : Edge name.
  271. * @variable Vertex target : Edge target Vertex
  272. * @variable Edge next : An Edge on the same level.
  273. */
  274. class Edge {
  275.  
  276. String id;
  277. Vertex target;
  278. Edge next;
  279. /**
  280. * Class constructor with three inputs. Creates a Edge object.
  281. */param konstruktoril
  282. Edge (String s, Vertex v, Edge e) {
  283. id = s;
  284. target = v;
  285. next = e;
  286. }
  287. /**
  288. * Class constructor with one input. Creates a Edge object.
  289. */
  290. Edge (String s) {
  291. this (s, null, null);
  292. }
  293.  
  294. @Override
  295. public String toString() {
  296. return id;
  297. }
  298.  
  299. // TODO!!! Your Edge methods here!
  300.  
  301. } // Edge
  302.  
  303.  
  304. /**
  305. * @author OTTMAC
  306. * @purpose: to hold graph id and 'root' Vertex
  307. * @variable String id: Graph name.
  308. * @variable Vertex first : First Vertex of a Graph.
  309. */
  310. static class Graph {
  311.  
  312. String id;
  313. Vertex first;
  314. /**
  315. * Class constructor with two inputs. Creates a Graph object.
  316. * @param s +desc
  317. * @ param v + desc
  318. */
  319. Graph (String s, Vertex v) {
  320. id = s;
  321. first = v;
  322. }
  323. /**
  324. * Class constructor with one input. Creates a Graph object.
  325. */
  326. Graph (String s) {
  327. this (s, null);
  328. }
  329.  
  330. @Override
  331. public String toString() {
  332. String nl = System.getProperty ("line.separator");
  333. StringBuffer sb = new StringBuffer (nl);
  334. sb.append (id + nl);
  335. Vertex v = first;
  336. while (v != null) {
  337. sb.append (v.toString() + " --> ");
  338. Edge e = v.first;
  339. while (e != null) {
  340. sb.append (e.toString());
  341. sb.append ("(" + v.toString() + "->"
  342. + e.target.toString() + ") ");
  343. e = e.next;
  344. }
  345. sb.append (nl);
  346. v = v.next;
  347. }
  348. return sb.toString();
  349. }
  350.  
  351. // TODO!!! Your Graph methods here!
  352. } // Graph
  353.  
  354. /**
  355. * @author OTTMAC
  356. * @param first Vertex: input Vertex object, contains the first element of the tree.
  357. * @purpose Creates two matrixes and starts to delete the smallest leaf from the given tree
  358. * until two Vertexes are left. The deleted leafs fathers compose an unique Pr�fer sequence
  359. * which is then printed onto the screen along with the given tree.
  360. * @return array containing Pryfer elements
  361. */
  362. public ArrayList<String> calculatePryfer(Vertex first){
  363. ArrayList<Andmed> andmed = new ArrayList<Andmed>();
  364. ArrayList<Sagedus> sagedus = new ArrayList<Sagedus>();
  365. Vertex tmp = first;
  366. Sagedus neueAlgus = new Sagedus();
  367. neueAlgus.nimi = tmp.id;
  368. neueAlgus.sagedus = -1;
  369. sagedus.add(neueAlgus);
  370. tmp = tmp.next;
  371. //maatriksi p�hi valmis, k�ik vertexid kirja.
  372. while(tmp != null){
  373. Sagedus neue = new Sagedus();
  374. neue.nimi = tmp.id;
  375. neue.sagedus = 0;
  376. sagedus.add(neue);
  377. tmp = tmp.next;
  378. }
  379. //Sagedustele
  380. while(first != null){
  381. if(first.first != null){
  382. Andmed uus = new Andmed(first.first.target.id, first.id);
  383. for(int i = 0; i<sagedus.size() ; i++){
  384. //kui on kellegi laps, pane sagedus k�rgemale
  385. if(sagedus.get(i).nimi.equals(first.first.target.id )){
  386. sagedus.get(i).sagedus ++;
  387. }
  388. //Kui on olemas, t�sta sagedust
  389. if(sagedus.get(i).nimi.equals(first.id)){
  390. sagedus.get(i).sagedus ++;
  391. }
  392. }
  393. //Lisa isa ja poja nimi
  394. andmed.add(uus);
  395. //kui isal on veel poegi, otsi nad k�ik �les ja pane kirja isa-poja paarid.
  396. //T�sta ka sagedust iga kord kui n�ed.
  397. if(first.first.next != null){
  398. Edge edgeTmp = first.first.next;
  399. while(edgeTmp != null){
  400. Andmed newBrotha = new Andmed(edgeTmp.target.id, first.id);
  401. andmed.add(newBrotha);
  402. for(int i = 0; i<sagedus.size() ; i++){
  403. if(sagedus.get(i).nimi.equals(edgeTmp.target.id)){
  404. sagedus.get(i).sagedus ++;
  405. }
  406. if(sagedus.get(i).nimi.equals(first.id)){
  407. sagedus.get(i).sagedus ++;
  408. }
  409. }
  410. edgeTmp = edgeTmp.next;
  411. }
  412. }
  413. }
  414. first = first.next;
  415. }
  416. //Kahe maatriksi p�hjal pr�feri arvutamine
  417. //olemas on sagedustabel ja isa-poja tabel
  418. //Hakkame otsima lehti, ehk siis neid kelle sagedus = 1
  419.  
  420. ArrayList<String> pryfer = new ArrayList<String>();
  421. while(andmed.size()!=1){
  422. if(andmed.size()==0){break;}
  423. Sagedus min = null;
  424. for(int i = 0; i<sagedus.size(); i++){
  425. if(sagedus.get(i).sagedus ==1){
  426. //Kui oleme esimese leidnud, paneme kirja selle miinimumLeheks
  427. if (min == null){
  428. min = sagedus.get(i);
  429. }
  430. //Kui leht on v�iksem kui miinimum, pane see min-iks
  431. else if (min.nimi.compareTo(sagedus.get(i).nimi) >0){
  432. min = sagedus.get(i);
  433. }
  434. }
  435. }
  436. //eemalda sagedustabelist miinimum
  437. sagedus.remove(min);
  438. //Leia andmemaatriksist miinimumi isa ja pane pr�feri massiivi isa v��rtus
  439. String isa = "";
  440. for(int i = 0 ; i<andmed.size() ; i++){
  441. if(andmed.get(i).nimi.equals(min.nimi)){
  442. isa = andmed.get(i).isa;
  443. pryfer.add(isa);
  444. andmed.remove(i);
  445. break;
  446. }
  447. }
  448. //Leia isa �les sagedustabelist ja v�henda tema sagedust 1 v�rra.
  449. for(int i = 0; i<sagedus.size(); i++){
  450. if(sagedus.get(i).nimi.equals(isa)){
  451. sagedus.get(i).sagedus --;
  452. }
  453. }
  454. //J�tka algoritmi kuni sagedusTabelisse on j��nud 1 element.
  455. }
  456.  
  457. return pryfer;
  458. }
  459. //sagedusmaatriksi loomiseks vajalik objekt
  460. /**
  461. * @author OTTMAC
  462. * @purpose for creating Vertex frequency table
  463. *@variable String nimi : Vertex name.
  464. *@variable int sagedus : According frequency
  465. */
  466. public class Sagedus{
  467. String nimi;
  468. int sagedus;
  469. }
  470. //isa-poja objekt.
  471. /**
  472. * @author OTTMAC
  473. * @purpose to hold father-son pairs.
  474. * @variable String nimi: Vertex child.
  475. * @variable String isa : Vertex father.
  476. */
  477. public class Andmed{
  478. String nimi;
  479. String isa;
  480. /**
  481. * Class constructor with two inputs. Creates an 'Andmed' object.
  482. */
  483. Andmed (String _nimi, String _isa) {
  484. nimi = _nimi;
  485. isa = _isa;
  486. }
  487. }
  488. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement