Advertisement
dzocesrce

[APS] Faculty Subjects

Aug 29th, 2023
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.74 KB | None | 0 0
  1. import java.util.Iterator;
  2. import java.util.Scanner;
  3. import java.util.Stack;
  4. import java.util.LinkedList;
  5.  
  6. class GraphNode<E> {
  7.     private int index;//index (reden broj) na temeto vo grafot
  8.     private E info;
  9.     private LinkedList<GraphNode<E>> neighbors;
  10.  
  11.     public GraphNode(int index, E info) {
  12.         this.index = index;
  13.         this.info = info;
  14.         neighbors = new LinkedList<GraphNode<E>>();
  15.     }
  16.  
  17.     boolean containsNeighbor(GraphNode<E> o){
  18.         return neighbors.contains(o);
  19.     }
  20.  
  21.     void addNeighbor(GraphNode<E> o){
  22.         neighbors.add(o);
  23.     }
  24.  
  25.  
  26.     void removeNeighbor(GraphNode<E> o){
  27.         if(neighbors.contains(o))
  28.             neighbors.remove(o);
  29.     }
  30.  
  31.  
  32.     @Override
  33.     public String toString() {
  34.         String ret= "INFO:"+info+" SOSEDI:";
  35.         for(int i=0;i<neighbors.size();i++)
  36.             ret+=neighbors.get(i).info+" ";
  37.         return ret;
  38.  
  39.     }
  40.  
  41.     @Override
  42.     public boolean equals(Object obj) {
  43.         @SuppressWarnings("unchecked")
  44.         GraphNode<E> pom = (GraphNode<E>)obj;
  45.         return (pom.info.equals(this.info));
  46.     }
  47.  
  48.     public int getIndex() {
  49.         return index;
  50.     }
  51.  
  52.     public void setIndex(int index) {
  53.         this.index = index;
  54.     }
  55.  
  56.     public E getInfo() {
  57.         return info;
  58.     }
  59.  
  60.     public void setInfo(E info) {
  61.         this.info = info;
  62.     }
  63.  
  64.     public LinkedList<GraphNode<E>> getNeighbors() {
  65.         return neighbors;
  66.     }
  67.  
  68.     public void setNeighbors(LinkedList<GraphNode<E>> neighbors) {
  69.         this.neighbors = neighbors;
  70.     }
  71.  
  72.  
  73.  
  74. }
  75. class Graph<E> {
  76.  
  77.     int num_nodes;
  78.     GraphNode<E> adjList[];
  79.  
  80.     @SuppressWarnings("unchecked")
  81.     public Graph(int num_nodes, E[] list) {
  82.         this.num_nodes = num_nodes;
  83.         adjList = (GraphNode<E>[]) new GraphNode[num_nodes];
  84.         for (int i = 0; i < num_nodes; i++)
  85.             adjList[i] = new GraphNode<E>(i, list[i]);
  86.     }
  87.  
  88.     @SuppressWarnings("unchecked")
  89.     public Graph(int num_nodes) {
  90.         this.num_nodes = num_nodes;
  91.         adjList = (GraphNode<E>[]) new GraphNode[num_nodes];
  92.         for (int i = 0; i < num_nodes; i++)
  93.             adjList[i] = new GraphNode<E>(i, null);
  94.     }
  95.  
  96.     int adjacent(int x, int y) {
  97.         // proveruva dali ima vrska od jazelot so
  98.         // indeks x do jazelot so indeks y
  99.         return (adjList[x].containsNeighbor(adjList[y])) ? 1 : 0;
  100.     }
  101.  
  102.     void addEdge(int x, int y) {
  103.         // dodava vrska od jazelot so indeks x do jazelot so indeks y
  104.         if (!adjList[x].containsNeighbor(adjList[y])) {
  105.             adjList[x].addNeighbor(adjList[y]);
  106.         }
  107.     }
  108.  
  109.     void deleteEdge(int x, int y) {
  110.         adjList[x].removeNeighbor(adjList[y]);
  111.     }
  112.  
  113.     /************************TOPOLOGICAL SORT*******************************************************************/
  114.  
  115.     void dfsVisit(Stack<Integer> s, int i, boolean[] visited){
  116.         if(!visited[i]){
  117.             visited[i] = true;
  118.             Iterator<GraphNode<E>> it = adjList[i].getNeighbors().iterator();
  119.             //System.out.println("dfsVisit: "+i+" Stack="+s);
  120.             while(it.hasNext()){
  121.                 dfsVisit(s, it.next().getIndex(), visited);
  122.             }
  123.             s.push(i);
  124.             //System.out.println("--dfsVisit: "+i+" Stack="+s);
  125.         }
  126.     }
  127.  
  128.     void topological_sort_dfs(int id_predmet){
  129.         boolean visited[] = new boolean[num_nodes];
  130.         for(int i=0;i<num_nodes;i++){
  131.             visited[i] = false;
  132.         }
  133.  
  134.         Stack<Integer> s = new Stack<Integer>();
  135.  
  136.         for(int i=0;i<num_nodes;i++){
  137.             dfsVisit(s,i,visited);
  138.         }
  139.         Stack<Integer> new_stack= new Stack<Integer>();
  140.         //System.out.println("----Stack="+s);
  141.         while(!s.isEmpty()){
  142.             //System.out.println(adjList[s.pop()]);
  143.             new_stack.push(s.pop());
  144.         }
  145.         while(new_stack.peek()!=id_predmet) new_stack.pop();
  146.         new_stack.pop();
  147.         if(new_stack.isEmpty()) System.out.println("Ova bese posledniot predmet!");
  148.         else
  149.         System.out.println(this.adjList[new_stack.peek()].getInfo());
  150.     }
  151.  
  152.     /***********************************************************************************************************/
  153.  
  154.     @Override
  155.     public String toString() {
  156.         String ret = new String();
  157.         for (int i = 0; i < this.num_nodes; i++)
  158.             ret += i + ": " + adjList[i] + "\n";
  159.         return ret;
  160.     }
  161.     public GraphNode<E> getNode(String ime){
  162.         for(int i=0;i<this.adjList.length;i++){
  163.             if(adjList[i].getInfo().equals(ime)) return adjList[i];
  164.         }
  165.         return null;
  166.     }
  167.  
  168. }
  169. public class FacultySubjects {
  170.     public static void main(String[] args) {
  171.         Scanner input= new Scanner(System.in);
  172.         int numSubjects= Integer.parseInt(input.nextLine());
  173.         Graph<String> graph= new Graph<>(numSubjects);
  174.         for(int i=0;i<numSubjects;i++){
  175.             String subject_name= input.nextLine();
  176.             graph.adjList[i].setIndex(i);
  177.             graph.adjList[i].setInfo(subject_name);
  178.         }
  179.         int numDependencies= Integer.parseInt(input.nextLine());
  180.         for(int i=0;i<numDependencies;i++){
  181.             String[] dependency= input.nextLine().split("\\s+");
  182.             for(int j=1;j<dependency.length;j++){
  183.                 graph.addEdge(graph.getNode(dependency[j]).getIndex(),i);
  184.             }
  185.         }
  186.         String subject= input.nextLine();
  187.         int id_predmet= graph.getNode(subject).getIndex();
  188.         graph.topological_sort_dfs(id_predmet);
  189.     }
  190. }
  191. /*
  192. 5
  193. Z1
  194. Z2
  195. I1
  196. I2
  197. I3
  198. 3
  199. I1 Z1 Z2
  200. I2 I1
  201. I3 Z2 I2
  202. --------
  203. I2
  204.  
  205. 5
  206. Z1
  207. Z2
  208. I1
  209. I2
  210. I3
  211. 3
  212. I1 Z1 Z2
  213. I2 I1
  214. I3 Z2 I2
  215. I3
  216. ---------------------------
  217. Ova bese posledniot predmet!
  218.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement