Advertisement
teodor_dalavera

Избор на предмет на факултет

Dec 23rd, 2017
454
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.59 KB | None | 0 0
  1. package IzborPredmet;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.util.*;
  7.  
  8. class Graph<E> {
  9.    
  10.     int num_nodes; // broj na jazli
  11.     E nodes[];    // informacija vo jazlite - moze i ne mora?
  12.     int adjMat[][];  // matrica na sosednost
  13.  
  14.     @SuppressWarnings("unchecked")
  15.     public Graph(int num_nodes) {
  16.         this.num_nodes = num_nodes;
  17.         nodes = (E[]) new Object[num_nodes];
  18.         adjMat = new int[num_nodes][num_nodes];
  19.        
  20.         for(int i=0;i<this.num_nodes;i++)
  21.             for(int j=0;j<this.num_nodes;j++)
  22.                 adjMat[i][j]=0;
  23.     }
  24.    
  25.    
  26.    
  27.     public Graph(int num_nodes, E[] nodes) {
  28.         this.num_nodes = num_nodes;
  29.         this.nodes = nodes;
  30.         adjMat = new int[num_nodes][num_nodes];
  31.        
  32.         for(int i=0;i<this.num_nodes;i++)
  33.             for(int j=0;j<this.num_nodes;j++)
  34.                 adjMat[i][j]=0;
  35.     }
  36.  
  37.  
  38.  
  39.     int adjacent(int x,int y)
  40.     {  // proveruva dali ima vrska od jazelot so indeks x do jazelot so indeks y
  41.        return (adjMat[x][y]!=0)?1:0;
  42.     }
  43.    
  44.     void addEdge(int x,int y)
  45.     {  // dodava vrska megu jazlite so indeksi x i y
  46.        adjMat[x][y]=1;
  47.     }
  48.    
  49.     void deleteEdge(int x,int y)
  50.     {
  51.        // ja brise vrskata megu jazlite so indeksi x i y
  52.        adjMat[x][y]=0;
  53.     }
  54.    
  55.     // Moze i ne mora?
  56.     E get_node_value(int x)
  57.     {  // ja vraka informacijata vo jazelot so indeks x
  58.           return nodes[x];
  59.     }
  60.  
  61.     // Moze i ne mora?
  62.     void set_node_value(int x, E a)
  63.     {  // ja postavuva informacijata vo jazelot so indeks na a
  64.        nodes[x]=a;
  65.     }
  66.    
  67.     public int getNum_nodes() {
  68.         return num_nodes;
  69.     }
  70.  
  71.     public void setNum_nodes(int num_nodes) {
  72.         this.num_nodes = num_nodes;
  73.     }
  74.  
  75.     void dfsSearch(int node) {
  76.         boolean visited[] = new boolean[num_nodes];
  77.         for (int i = 0; i < num_nodes; i++)
  78.             visited[i] = false;
  79.         dfsRecursive(node, visited);
  80.     }
  81.  
  82.     void dfsRecursive(int node, boolean visited[]) {
  83.         visited[node] = true;
  84.         System.out.println(node + ": " + nodes[node]);
  85.  
  86.         for (int i = 0; i < this.num_nodes; i++) {
  87.             if(adjacent(node, i)==1){
  88.                 if (!visited[i])
  89.                     dfsRecursive(i, visited);
  90.             }
  91.         }
  92.     }
  93.    
  94.     void dfsNonrecursive(int node) {
  95.         boolean visited[] = new boolean[num_nodes];
  96.         for (int i = 0; i < num_nodes; i++)
  97.             visited[i] = false;
  98.         visited[node] = true;
  99.         System.out.println(node + ": " + nodes[node]);
  100.         Stack<Integer> s = new Stack<Integer>();
  101.         s.push(node);
  102.  
  103.         int pom;
  104.  
  105.         while (!s.isEmpty()) {
  106.             pom = s.peek();
  107.             int pom1 = pom;
  108.             for (int i = 0; i < num_nodes; i++) {
  109.                 if(adjacent(pom,i)==1){
  110.                     pom1 = i;
  111.                     if(!visited[i])
  112.                         break;
  113.                 }          
  114.             }
  115.             if(!visited[pom1]){
  116.                 visited[pom1] = true;
  117.                 System.out.println(pom1 + ": " + nodes[pom1]);
  118.                 s.push(pom1);
  119.             }
  120.             else
  121.                 s.pop();
  122.         }
  123.  
  124.     }
  125.    
  126.     void bfs(int node){
  127.         boolean visited[] = new boolean[num_nodes];
  128.         for (int i = 0; i < num_nodes; i++)
  129.             visited[i] = false;
  130.         visited[node] = true;
  131.         System.out.println(node+": " + nodes[node]);
  132.         Queue<Integer> q = new LinkedQueue<Integer>();
  133.         q.enqueue(node);
  134.        
  135.         int pom;
  136.        
  137.         while(!q.isEmpty()){
  138.             pom = q.dequeue();
  139.             for (int i = 0; i < num_nodes; i++) {
  140.                 if(adjacent(pom, i)==1){
  141.                     if (!visited[i]){
  142.                         visited[i] = true;
  143.                         System.out.println(i+": " + nodes[i]);
  144.                         q.enqueue(i);
  145.                     }
  146.                    
  147.                 }
  148.             }
  149.            
  150.            
  151.         }
  152.        
  153.     }
  154.  
  155.     @Override
  156.     public String toString() {
  157.         String ret="  ";
  158.         for(int i=0;i<num_nodes;i++)
  159.             ret+=nodes[i]+" ";
  160.         ret+="\n";
  161.         for(int i=0;i<num_nodes;i++){
  162.             ret+=nodes[i]+" ";
  163.             for(int j=0;j<num_nodes;j++)
  164.                 ret+=adjMat[i][j]+" ";
  165.             ret+="\n";
  166.         }
  167.         return ret;
  168.     }
  169.    
  170.     int predmeti (int start){
  171.         int node = -1;
  172.        
  173.         boolean[] visited = new boolean[this.num_nodes];
  174.        
  175.         for(int i=0; i<this.num_nodes; i++){
  176.             visited[i] = false;
  177.         }
  178.        
  179.         visited[start] = true;
  180.        
  181.         LinkedQueue<Integer> q = new LinkedQueue<>();
  182.        
  183.         for(int i=0; i<this.num_nodes; i++){
  184.             if(this.adjacent(start, i) == 1){
  185.                 q.enqueue(i);
  186.                 visited[i] = true;
  187.                 node = i;
  188.             }
  189.         }
  190.        
  191.         return node;
  192.     }
  193.  
  194. }
  195.  
  196. class GraphNode<E> {
  197.     private int index;//index (reden broj) na temeto vo grafot
  198.     private String info;
  199.     private LinkedList<GraphNode<E>> neighbors;
  200.    
  201.     public GraphNode(int index, String info) {
  202.         this.index = index;
  203.         this.info = info;
  204.         neighbors = new LinkedList<GraphNode<E>>();
  205.     }
  206.    
  207.     boolean containsNeighbor(GraphNode<E> o){
  208.         return neighbors.contains(o);
  209.     }
  210.    
  211.     void addNeighbor(GraphNode<E> o){
  212.         neighbors.add(o);
  213.     }
  214.    
  215.     void removeNeighbor(GraphNode<E> o){
  216.         if(neighbors.contains(o))
  217.             neighbors.remove(o);
  218.     }
  219.    
  220.     @Override
  221.     public String toString() {
  222.         String ret= "INFO:"+info+" SOSEDI:";
  223.         for(int i=0;i<neighbors.size();i++)
  224.         ret+=neighbors.get(i).info+" ";
  225.         return ret;
  226.        
  227.     }
  228.  
  229.     @Override
  230.     public boolean equals(Object obj) {
  231.         @SuppressWarnings("unchecked")
  232.         GraphNode<E> pom = (GraphNode<E>)obj;
  233.         return (pom.info.equals(this.info));
  234.     }
  235.  
  236.     public int getIndex() {
  237.         return index;
  238.     }
  239.  
  240.     public void setIndex(int index) {
  241.         this.index = index;
  242.     }
  243.  
  244.     public String getInfo() {
  245.         return info;
  246.     }
  247.  
  248.     public void setInfo(String exp) {
  249.         this.info = exp;
  250.     }
  251.  
  252.     public LinkedList<GraphNode<E>> getNeighbors() {
  253.         return neighbors;
  254.     }
  255.  
  256.     public void setNeighbors(LinkedList<GraphNode<E>> neighbors) {
  257.         this.neighbors = neighbors;
  258.     }
  259.  
  260.    
  261.    
  262. }
  263.  
  264. class LinkedQueue<E> implements Queue<E> {
  265.  
  266.     // Redicata e pretstavena na sledniot nacin:
  267.     // length go sodrzi brojot na elementi.
  268.     // Elementite se zachuvuvaat vo jazli dod SLL
  269.     // front i rear se linkovi do prviot i posledniot jazel soodvetno.
  270.     SLLNode<E> front, rear;
  271.     int length;
  272.  
  273.     // Konstruktor ...
  274.  
  275.     public LinkedQueue () {
  276.         clear();
  277.     }
  278.  
  279.     public boolean isEmpty () {
  280.         // Vrakja true ako i samo ako redicata e prazena.
  281.         return (length == 0);
  282.     }
  283.  
  284.     public int size () {
  285.         // Ja vrakja dolzinata na redicata.
  286.         return length;
  287.     }
  288.  
  289.     public E peek () {
  290.         // Go vrakja elementot na vrvot t.e. pocetokot od redicata.
  291.         if (front == null)
  292.             throw new NoSuchElementException();
  293.         return front.element;
  294.     }
  295.  
  296.     public void clear () {
  297.         // Ja prazni redicata.
  298.         front = rear = null;
  299.         length = 0;
  300.     }
  301.  
  302.     public void enqueue (E x) {
  303.         // Go dodava x na kraj od redicata.
  304.         SLLNode<E> latest = new SLLNode<E>(x, null);
  305.         if (rear != null) {
  306.             rear.succ = latest;
  307.             rear = latest;
  308.         } else
  309.             front = rear = latest;
  310.         length++;
  311.     }
  312.  
  313.     public E dequeue () {
  314.         // Go otstranuva i vrakja pochetniot element na redicata.
  315.         if (front != null) {
  316.             E frontmost = front.element;
  317.             front = front.succ;
  318.             if (front == null)  rear = null;
  319.             length--;
  320.             return frontmost;
  321.         } else
  322.             throw new NoSuchElementException();
  323.     }
  324.  
  325. }
  326.  
  327. interface Queue<E> {
  328.  
  329.     // Elementi na redicata se objekti od proizvolen tip.
  330.  
  331.     // Metodi za pristap:
  332.  
  333.     public boolean isEmpty ();
  334.         // Vrakja true ako i samo ako redicata e prazena.
  335.  
  336.     public int size ();
  337.         // Ja vrakja dolzinata na redicata.
  338.  
  339.     public E peek ();
  340.         // Go vrakja elementot na vrvot t.e. pocetokot od redicata.
  341.  
  342.     // Metodi za transformacija:
  343.  
  344.     public void clear ();
  345.         // Ja prazni redicata.
  346.  
  347.     public void enqueue (E x);
  348.         // Go dodava x na kraj od redicata.
  349.  
  350.     public E dequeue ();
  351.         // Go otstranuva i vrakja pochetniot element na redicata.
  352.  
  353. }
  354.  
  355. class SLLNode<E> {
  356.     protected E element;
  357.     protected SLLNode<E> succ;
  358.  
  359.     public SLLNode(E elem, SLLNode<E> succ) {
  360.         this.element = elem;
  361.         this.succ = succ;
  362.     }
  363.  
  364.     @Override
  365.     public String toString() {
  366.         return element.toString();
  367.     }
  368. }
  369.  
  370. public class IzborPredmet {
  371.  
  372.     public static void main(String[] args) throws IOException {
  373.  
  374.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  375.         String expr = br.readLine();
  376.         String[] exp;
  377.        
  378.         int teminja = Integer.parseInt(expr);
  379.         Graph<Integer> g = new Graph<>(teminja);
  380.         Hashtable<String, Integer> h = new Hashtable<>();
  381.         Hashtable<Integer, String> h1 = new Hashtable<>();
  382.        
  383.         for(int i=0; i<teminja; i++){
  384.             String key = br.readLine();
  385.             h.put(key, i);
  386.             h1.put(i, key);
  387.         }
  388.        
  389.         int rebra = Integer.parseInt(br.readLine());
  390.        
  391.         for(int i=0; i<rebra; i++){
  392.             expr = br.readLine();
  393.             exp = expr.split(" ");
  394.             int end = h.get(exp[0]);
  395.             for(int j=0; j<exp.length; j++){
  396.                 g.addEdge(h.get(exp[j]), end);
  397.             }
  398.         }
  399.        
  400.         int start = h.get(br.readLine());
  401.    
  402.         g.bfs(start);
  403.        
  404.         //System.out.println(h1.get(predmet));
  405.        
  406.         br.close();
  407.  
  408.     }
  409.  
  410. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement