Advertisement
Mitrezzz

[АПС] Лаб 9: Вовед во графови Социјална мрежа

Jan 6th, 2021
1,269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.64 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.LinkedList;
  5. import java.util.Queue;
  6.  
  7. public class CountFacebookFriends {
  8.    
  9.     public static void main(String[] args) throws NumberFormatException, IOException {
  10.        
  11.         BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
  12.        
  13.         int howManyUsers = Integer.parseInt(bf.readLine());
  14.         Integer[] nodeInfo = new Integer[howManyUsers];
  15.         for(int i=0;i<howManyUsers;i++)
  16.             nodeInfo[i] = i;
  17.         Graph<Integer> users = new Graph<>(howManyUsers, nodeInfo);
  18.        
  19.         for(int i=0;i<howManyUsers;i++) {
  20.             int howManyFriends = Integer.parseInt(bf.readLine());
  21.             for(int j=0;j<howManyFriends;j++) {
  22.                 int y = Integer.parseInt(bf.readLine().split(" ")[0]);
  23.                 users.addEdge(i, y);
  24.             }
  25.         }
  26.        
  27.         int from = Integer.parseInt(bf.readLine());
  28.         int to = Integer.parseInt(bf.readLine());
  29.        
  30.         users.bfs(from,to);
  31.        
  32.     }
  33.    
  34. }
  35.  
  36. class GraphNode<E> {
  37.     private int index;//index (reden broj) na temeto vo grafot
  38.     private E info;
  39.     private LinkedList<GraphNode<E>> neighbors;
  40.    
  41.     public GraphNode(int index, E info) {
  42.         this.index = index;
  43.         this.info = info;
  44.         neighbors = new LinkedList<GraphNode<E>>();
  45.     }
  46.    
  47.     boolean containsNeighbor(GraphNode<E> o){
  48.         return neighbors.contains(o);
  49.     }
  50.    
  51.     void addNeighbor(GraphNode<E> o){
  52.         neighbors.add(o);
  53.     }
  54.    
  55.     void removeNeighbor(GraphNode<E> o){
  56.         if(neighbors.contains(o))
  57.             neighbors.remove(o);
  58.     }
  59.    
  60.     @Override
  61.     public String toString() {
  62.         String ret= "INFO:"+info+" SOSEDI:";
  63.         for(int i=0;i<neighbors.size();i++)
  64.         ret+=neighbors.get(i).info+" ";
  65.         return ret;
  66.        
  67.     }
  68.  
  69.     @Override
  70.     public boolean equals(Object obj) {
  71.         @SuppressWarnings("unchecked")
  72.         GraphNode<E> pom = (GraphNode<E>)obj;
  73.         return (pom.info.equals(this.info));
  74.     }
  75.  
  76.     public int getIndex() {
  77.         return index;
  78.     }
  79.  
  80.     public void setIndex(int index) {
  81.         this.index = index;
  82.     }
  83.  
  84.     public E getInfo() {
  85.         return info;
  86.     }
  87.  
  88.     public void setInfo(E info) {
  89.         this.info = info;
  90.     }
  91.  
  92.     public LinkedList<GraphNode<E>> getNeighbors() {
  93.         return neighbors;
  94.     }
  95.  
  96.     public void setNeighbors(LinkedList<GraphNode<E>> neighbors) {
  97.         this.neighbors = neighbors;
  98.     }  
  99. }
  100.  
  101. class Graph<E> {
  102.  
  103.     int num_nodes;
  104.     GraphNode<E> adjList[];
  105.  
  106.     @SuppressWarnings("unchecked")
  107.     public Graph(int num_nodes, E[] list) {
  108.         this.num_nodes = num_nodes;
  109.         adjList = (GraphNode<E>[]) new GraphNode[num_nodes];
  110.         for (int i = 0; i < num_nodes; i++)
  111.             adjList[i] = new GraphNode<E>(i, list[i]);
  112.     }
  113.  
  114.     @SuppressWarnings("unchecked")
  115.     public Graph(int num_nodes) {
  116.         this.num_nodes = num_nodes;
  117.         adjList = (GraphNode<E>[]) new GraphNode[num_nodes];
  118.     }
  119.  
  120.     boolean adjacent(int x, int y) {
  121.         // proveruva dali ima vrska od jazelot so
  122.         // indeks x do jazelot so indeks y
  123.         return adjList[x].containsNeighbor(adjList[y]);
  124.     }
  125.  
  126.     void addEdge(int x, int y) {
  127.         // dodava vrska od jazelot so indeks x do jazelot so indeks y
  128.         if (!adjList[x].containsNeighbor(adjList[y])) {
  129.             adjList[x].addNeighbor(adjList[y]);
  130.         }
  131.         if(!adjList[y].containsNeighbor(adjList[x])) {
  132.             adjList[y].addNeighbor(adjList[x]);
  133.         }
  134.     }
  135.  
  136.     void deleteEdge(int x, int y) {
  137.         adjList[x].removeNeighbor(adjList[y]);
  138.         adjList[y].removeNeighbor(adjList[x]);
  139.     }
  140.    
  141.     void bfs(int from, int to){
  142.         boolean visited[] = new boolean[num_nodes];
  143.         for (int i = 0; i < num_nodes; i++)
  144.             visited[i] = false;
  145.         visited[from] = true;
  146.         Queue<Integer> q = new LinkedList<Integer>();
  147.         q.add(from);
  148.        
  149.         GraphNode<E> pom;
  150.        
  151.         int distance = 0;
  152.         int parent = from;
  153.        
  154.         while(!q.isEmpty()){
  155.             pom = adjList[q.poll()];
  156.             if(pom.getIndex() == to)
  157.                 break;
  158.             if(q.peek() == null || !this.adjacent(q.peek(), parent)) {
  159.                 // gledaj kako drvo, bfs na nekoj nacin grafot go pretvara vo drvo
  160.                 // koren = from, pa se dodeka ne se izminat site negovi deca, distance ne se zgolemuva
  161.                 // odnosno se dodeka ne naidesh vo redot na nekoj koj ne e sosed so navedeniot parent
  162.                 // ako toa se desi, stavi go parent da bide node - ot koj ne e sosed so prethodniot parent
  163.                 // zgolemi distance i prodolzi da proveruvash se dodeka vo redot ne stignesh do node == to
  164.                 distance++;
  165.                 parent = pom.getIndex();
  166.             }
  167.             GraphNode<E> tmp=null;
  168.             for (int i = 0; i < pom.getNeighbors().size(); i++) {
  169.                 tmp = pom.getNeighbors().get(i);
  170.                 if (!visited[tmp.getIndex()]){
  171.                     visited[tmp.getIndex()] = true;
  172.                     q.add(tmp.getIndex());
  173.                 }
  174.             }
  175.            
  176.         }
  177.         System.out.println(distance);
  178.     }
  179.    
  180.  
  181.     @Override
  182.     public String toString() {
  183.         String ret = new String();
  184.         for (int i = 0; i < this.num_nodes; i++)
  185.             ret += i + ": " + adjList[i] + "\n";
  186.         return ret;
  187.     }
  188.  
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement