Advertisement
fensa08

#APS Lab 2/10

Jan 2nd, 2020
1,653
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.93 KB | None | 0 0
  1. Хиерархија Problem 2 (0 / 0)
  2.  
  3. Во една организација постојат повеќе членови. На една од седниците избрано е кој член ќе биде претседател на таа организација. Потребно е за секој член (освен за претседателот) да се определи еден претпоставен од кој ќе се примаат директни наредби. Во организацијата треба да има хиерархиска структура така што на врвот на хиерархијата ќе биде претседателот. Проблемот е што некои членови подобро соработуваат меѓу себе, а некои полошо. За секој пар членови постои број од 1 до 10 што означува колку добро соработуваат двата членови (1 значи дека многу добро соработуваат, а 10 значи дека многу тешко соработуваат). Многу важно за организацијата е да се избере хиерархијата на тој начин што збирот од мерките за соработка помеѓу сите парови на членови кои што се во подреден-надреден врска да е минимална, што значи дека членовите најдобро соработуваат.
  4.  
  5. Да се напише алгоритам кој на излез ќе го врати збирот од оптималните мерки за соработка.
  6.  
  7. Хиерархијата во организацијата е претставена како тежински граф. Во првиот ред од влезот е даден број на членови во организацијата. Во вториот ред од влезот е даден бројот на соработки. Во следните редови се дадени соработките во облик: реден број на прв член, име на прв член, реден број на втор член, име на втор член, мерка за соработка. Во последниот ред е дадено името на претседателот.
  8.  
  9. На излез треба да се испечати збирот од најдобрите соработки.
  10.  
  11. ========================================================================================================================================
  12.  
  13. import java.io.BufferedReader;
  14. import java.io.IOException;
  15. import java.io.InputStreamReader;
  16. import java.util.*;
  17.  
  18.  
  19. import java.util.Iterator;
  20.  
  21.  
  22. class Graph<E> {
  23.  
  24.     int num_nodes;
  25.     GraphNode<E> adjList[];
  26.  
  27.     @SuppressWarnings("unchecked")
  28.     public Graph(int num_nodes, E[] list) {
  29.         this.num_nodes = num_nodes;
  30.         adjList = (GraphNode<E>[]) new GraphNode[num_nodes];
  31.         for (int i = 0; i < num_nodes; i++)
  32.             adjList[i] = new GraphNode<E>(i, list[i]);
  33.     }
  34.  
  35.     @SuppressWarnings("unchecked")
  36.     public Graph(int num_nodes) {
  37.         this.num_nodes = num_nodes;
  38.         adjList = (GraphNode<E>[]) new GraphNode[num_nodes];
  39.         for (int i = 0; i < num_nodes; i++)
  40.             adjList[i] = new GraphNode<E>(i, null);
  41.     }
  42.  
  43.     int adjacent(int x, int y) {
  44.         // proveruva dali ima vrska od jazelot so
  45.         // indeks x do jazelot so indeks y
  46.         return (adjList[x].containsNeighbor(adjList[y])) ? 1 : 0;
  47.     }
  48.  
  49.     void addEdge(int x, int y, float tezina) {
  50.         // dodava vrska od jazelot so indeks x do jazelot so indeks y so tezina
  51.         // i obratno
  52.         if (adjList[x].containsNeighbor(adjList[y])) {
  53.             adjList[x].updateNeighborWeight(adjList[y], tezina);
  54.             adjList[y].updateNeighborWeight(adjList[x], tezina);
  55.         } else{
  56.             adjList[x].addNeighbor(adjList[y], tezina);
  57.             adjList[y].addNeighbor(adjList[x], tezina);
  58.         }
  59.     }
  60.  
  61.     void deleteEdge(int x, int y) {
  62.         adjList[x].removeNeighbor(adjList[y]);
  63.         adjList[y].removeNeighbor(adjList[x]);
  64.     }
  65.  
  66.     /*************************** KRUSKAL ***********************************************************************/
  67.  
  68.     // Metoda koja generira niza od site rebra vo grafot
  69.     public Edge[] getAllEdges() {
  70.         int totalEdges = 0;
  71.         for (int i = 0; i < this.num_nodes; i++) {
  72.             // za sekoe teme go dodavame brojot na sosedi koi gi ima
  73.             totalEdges += this.adjList[i].getNeighbors().size();
  74.         }
  75.  
  76.         totalEdges /= 2; //bidejki e nenasocen graf, sekoe rebro se javuva kaj dve teminja
  77.  
  78.         Edge[] edges = new Edge[totalEdges];
  79.         int index = 0;
  80.         for (int i = 0; i < this.num_nodes; i++) {
  81.             for (int j = 0; j < this.adjList[i].getNeighbors().size(); j++) {
  82.                 int index1 = this.adjList[i].getIndex();
  83.                 // se zemaat indeksot i tezinata na j-ot sosed na temeto i
  84.                 int index2 = this.adjList[i].getNeighbors().get(j).node
  85.                         .getIndex();
  86.                 float weight = this.adjList[i].getNeighbors().get(j).weight;
  87.                 if(index2>index1) //bidejki grafot e nenasocen, da ne go zemame sekoe rebro dva pati
  88.                     edges[index++] = new Edge(index1, index2, weight);
  89.             }
  90.         }
  91.  
  92.         return edges;
  93.     }
  94.  
  95.     // Metoda koja gi sortira site rebra
  96.     private void sortEdges(Edge[] edges) {
  97.         for (int i = 0; i < edges.length - 1; i++) {
  98.             for (int j = i + 1; j < edges.length; j++) {
  99.                 if (edges[i].getWeight() > edges[j].getWeight()) {
  100.                     Edge tmp = edges[i];
  101.                     edges[i] = edges[j];
  102.                     edges[j] = tmp;
  103.                 }
  104.             }
  105.         }
  106.  
  107.     }
  108.  
  109.     //Metoda koja pravi unija na dve drva
  110.     private void union(int u, int v, int[] vrski){
  111.         int findWhat, replaceWith;
  112.  
  113.         if(u < v){
  114.             findWhat = vrski[v];
  115.             replaceWith = vrski[u];
  116.         }
  117.         else{
  118.             findWhat = vrski[u];
  119.             replaceWith = vrski[v];
  120.         }
  121.  
  122.         //za dvete poddrva stava ist index
  123.         //vo vrski t.e. gi spojuva
  124.         for(int i=0; i<vrski.length; i++){
  125.             if(vrski[i] == findWhat){
  126.                 vrski[i] = replaceWith;
  127.             }
  128.         }
  129.     }
  130.  
  131.     List<Edge> kruskal() {
  132.         /*
  133.          * Pomoshna niza za sledenje na kreiranite drva
  134.          * Ako dve teminja se del od isto poddrvo
  135.          * togash imaat ista vrednost vo nizata
  136.          */
  137.         int vrski[] = new int[this.num_nodes];
  138.  
  139.         // niza koja gi sodrzi site rebra
  140.         Edge[] edges = this.getAllEdges();
  141.         // se sortiraat rebrata spored tezinite vo neopagjacki redosled
  142.         this.sortEdges(edges);
  143.  
  144.         // inicijalizacija na pomosnata niza za evidencija,
  145.         // sekoj jazel si e posebno drvo
  146.         for (int i = 0; i < this.num_nodes; i++)
  147.             vrski[i] = i;
  148.  
  149.         // lista koja kje gi sodrzi MST rebra
  150.         List<Edge> mstEdges = new ArrayList<Edge>();
  151.  
  152.         for(int i=0; i<edges.length; i++){
  153.             //za sekoe rebro vo sortiran redosled
  154.             Edge e = edges[i];
  155.  
  156.             if(vrski[e.getFrom()] != vrski[e.getTo()]){
  157.                 //ako teminjata na ova rebro ne se vo isto poddrvo
  158.                 //ova rebro e MST rebro
  159.                 mstEdges.add(e);
  160.                 //sega dvete teminja treba da se vo isto poddrvo
  161.                 //t.e se pravi merge (unija) t.s. vo nizata vrski
  162.                 //za site elementi od dvete poddrva
  163.                 //go setira istiot (najmal) element od dvete poddrva
  164.                 //vrski = this.union(e.getFrom(), e.getTo(), vrski);
  165.                 this.union(e.getFrom(), e.getTo(), vrski);
  166.             }
  167.  
  168.             //ako sme dodale num_nodes-1 rebra moze da prestaneme
  169.             if(mstEdges.size()==(this.num_nodes-1))
  170.                 break;
  171.         }
  172.  
  173.         return mstEdges;
  174.     }
  175.  
  176.     /*******************************************************************************************************/
  177.     /************************ PRIM **************************************************************************/
  178.  
  179.     //Metoda koja go naogja najmaloto rebro do
  180.     //teme na neposeten sosed
  181.     private Edge getMinimalEdge(boolean[] included){
  182.         int index1 = Integer.MAX_VALUE, index2 = Integer.MAX_VALUE;
  183.         float minweight = Float.MAX_VALUE;
  184.  
  185.         for(int i=0;i<this.num_nodes;i++){
  186.             if(included[i]){
  187.                 //ako e vkluceno temeto i
  188.                 //izmini gi negovite nevkluceni sosedi
  189.                 Iterator<GraphNodeNeighbor<E>> it = adjList[i].getNeighbors().iterator();
  190.                 while(it.hasNext()){
  191.                     GraphNodeNeighbor<E> pom = it.next();
  192.                     //ako sosedot ne e poseten i ima do sega najmala tezina
  193.                     if(!included[pom.node.getIndex()] && pom.weight<minweight){
  194.                         index1 = i;
  195.                         index2 = pom.node.getIndex();
  196.                         minweight = pom.weight;
  197.                     }
  198.                 }
  199.             }
  200.         }
  201.  
  202.         if(minweight<Float.MAX_VALUE){
  203.             Edge ret = new Edge(index1, index2, minweight);
  204.             return ret;
  205.         }
  206.         return null;
  207.     }
  208.  
  209.  
  210.     List<Edge> prim(int start_index) {
  211.         // lista koja kje gi sodrzi MST rebra
  212.         List<Edge> mstEdges = new ArrayList<Edge>();
  213.  
  214.         boolean included[] = new boolean[this.num_nodes];
  215.         for(int i=0;i<this.num_nodes;i++)
  216.             included[i]=false;
  217.  
  218.         included[start_index] = true;
  219.  
  220.         for(int i=0;i<this.num_nodes-1;i++){
  221.             Edge e = this.getMinimalEdge(included);
  222.             if(e==null){
  223.                 System.out.println("Ne mozat da se povrzat site jazli");
  224.                 break;
  225.             }
  226.             included[e.getFrom()] = included[e.getTo()] = true;
  227.             mstEdges.add(e);
  228.         }
  229.  
  230.         return mstEdges;
  231.     }
  232.  
  233.     /*******************************************************************************************************/
  234.     /***************** DIJKSTRA ******************************************************************************/
  235.  
  236.     float[] dijkstra(int from) {
  237.  
  238.         /* Minimalna cena do sekoe od teminjata */
  239.         float distance[] = new float[this.num_nodes];
  240.         /* dali za temeto e najdena konecnata (minimalna) cena */
  241.         boolean finalno[] = new boolean[this.num_nodes];
  242.         for (int i = 0; i < this.num_nodes; i++) {
  243.             distance[i] = -1;
  244.             finalno[i] = false;
  245.         }
  246.  
  247.         finalno[from] = true;
  248.         distance[from] = 0;
  249.  
  250.         /*
  251.          * vo sekoj cekor za edno teme se dobiva konecna minimalna cena
  252.          */
  253.         for (int i = 1; i < this.num_nodes; i++) {
  254.             /* za site sledbenici na from presmetaj ja cenata */
  255.             Iterator<GraphNodeNeighbor<E>> it = adjList[from].getNeighbors().iterator();
  256.             while (it.hasNext()) {
  257.                 GraphNodeNeighbor<E> pom = it.next();
  258.                 /* ako grankata kon sosedot nema konecna cena */
  259.                 if (!finalno[pom.node.getIndex()]) {
  260.                     /* ako ne e presmetana cena za temeto */
  261.                     if (distance[pom.node.getIndex()] <= 0) {
  262.                         distance[pom.node.getIndex()] = distance[from]
  263.                                 + pom.weight;
  264.                     }
  265.                     /* inaku, ako e pronajdena poniska */
  266.                     else if (distance[from] + pom.weight < distance[pom.node
  267.                             .getIndex()]) {
  268.                         distance[pom.node.getIndex()] = distance[from]
  269.                                 + pom.weight;
  270.                     }
  271.                 }
  272.             }
  273.  
  274.             /* najdi teme so min. cena koja ne e konecna */
  275.             boolean minit = false; /* min. ne e inicijaliziran */
  276.             int k = -1;
  277.             float minc = -1;
  278.             /* proveri gi site teminja */
  279.             for (int j = 0; j < this.num_nodes; j++) {
  280.                 if (!finalno[j] && distance[j] != -1) { /*ako cenata ne e  konecna*/
  281.                     if (!minit) { /* ako ne e inicijaliziran minimumot */
  282.                         minc = distance[k = j]; /* proglasi go ova e minimum */
  283.                         minit = true; /* oznaci deka min e inicijaliziran */
  284.                     }
  285.                     /* proveri dali e pronajdeno teme so pomala cena */
  286.                     else if (minc > distance[j] && distance[j] > 0)
  287.                         minc = distance[k = j];
  288.                 }
  289.             }
  290.             finalno[from = k] = true;
  291.         }
  292.  
  293.         return distance;
  294.  
  295.     }
  296.  
  297.     /*******************************************************************************************************/
  298.  
  299.     @Override
  300.     public String toString() {
  301.         String ret = new String();
  302.         for (int i = 0; i < this.num_nodes; i++)
  303.             ret += adjList[i] + "\n";
  304.         return ret;
  305.     }
  306.  
  307. }
  308.  
  309. class GraphNode<E> {
  310.     private int index; //index (reden broj) na temeto vo grafot
  311.     private E info;
  312.     private LinkedList<GraphNodeNeighbor<E>> neighbors;
  313.  
  314.     public GraphNode(int index, E info) {
  315.         this.index = index;
  316.         this.info = info;
  317.         neighbors = new LinkedList<GraphNodeNeighbor<E>>();
  318.     }
  319.  
  320.     public boolean containsNeighbor(GraphNode<E> o){
  321.         GraphNodeNeighbor<E> pom = new GraphNodeNeighbor<E>(o,0);
  322.         return neighbors.contains(pom);
  323.     }
  324.  
  325.     public void addNeighbor(GraphNode<E> o, float weight){
  326.         GraphNodeNeighbor<E> pom = new GraphNodeNeighbor<E>(o,weight);
  327.         neighbors.add(pom);
  328.     }
  329.  
  330.     public void removeNeighbor(GraphNode<E> o){
  331.         GraphNodeNeighbor<E> pom = new GraphNodeNeighbor<E>(o,0);
  332.         if(neighbors.contains(pom))
  333.             neighbors.remove(pom);
  334.     }
  335.  
  336.     @Override
  337.     public String toString() {
  338.         String ret= "INFO:"+info+" SOSEDI:";
  339.         for(int i=0;i<neighbors.size();i++)
  340.             ret+="("+neighbors.get(i).node.info+","+neighbors.get(i).weight+") ";
  341.         return ret;
  342.  
  343.     }
  344.  
  345.     public void updateNeighborWeight(GraphNode<E> o, float weight){
  346.         Iterator<GraphNodeNeighbor<E>> i = neighbors.iterator();
  347.         while(i.hasNext()){
  348.             GraphNodeNeighbor<E> pom = i.next();
  349.             if(pom.node.equals(o))
  350.                 pom.weight = weight;
  351.         }
  352.  
  353.     }
  354.  
  355.     @Override
  356.     public boolean equals(Object obj) {
  357.         @SuppressWarnings("unchecked")
  358.         GraphNode<E> pom = (GraphNode<E>)obj;
  359.         return (pom.info.equals(this.info));
  360.     }
  361.  
  362.     public int getIndex() {
  363.         return index;
  364.     }
  365.  
  366.     public void setIndex(int index) {
  367.         this.index = index;
  368.     }
  369.  
  370.     public E getInfo() {
  371.         return info;
  372.     }
  373.  
  374.     public void setInfo(E info) {
  375.         this.info = info;
  376.     }
  377.  
  378.     public LinkedList<GraphNodeNeighbor<E>> getNeighbors() {
  379.         return neighbors;
  380.     }
  381.  
  382.     public void setNeighbors(LinkedList<GraphNodeNeighbor<E>> neighbors) {
  383.         this.neighbors = neighbors;
  384.     }
  385.  
  386.  
  387.  
  388. }
  389.  
  390.  class GraphNodeNeighbor<E> {
  391.     GraphNode<E> node;
  392.     float weight;
  393.  
  394.     public GraphNodeNeighbor(GraphNode<E> node, float weight) {
  395.         this.node = node;
  396.         this.weight = weight;
  397.     }
  398.  
  399.     public GraphNodeNeighbor(GraphNode<E> node) {
  400.         this.node = node;
  401.         this.weight = 0;
  402.     }
  403.  
  404.     @Override
  405.     public boolean equals(Object obj) {
  406.         @SuppressWarnings("unchecked")
  407.         GraphNodeNeighbor<E> pom = (GraphNodeNeighbor<E>)obj;
  408.         return pom.node.equals(this.node);
  409.     }
  410.  
  411.  
  412.  
  413.  
  414.  
  415. }
  416.  
  417.  class Edge{
  418.      private int fromVertex, toVertex;
  419.      private float weight;
  420.      public Edge(int from, int to, float weight){
  421.          this.fromVertex = from;
  422.          this.toVertex = to;
  423.          this.weight = weight;
  424.      }
  425.  
  426.      public int getFrom(){
  427.          return this.fromVertex;
  428.      }
  429.      public int getTo(){
  430.          return this.toVertex;
  431.      }
  432.      public float getWeight(){
  433.          return this.weight;
  434.      }
  435.  
  436.      @Override
  437.      public String toString() {
  438.          return "("+fromVertex+","+toVertex+")="+weight+" ";
  439.      }
  440.  
  441.  
  442.  }
  443.  
  444. public class Hierarchy {
  445.  
  446.  
  447.  
  448.  
  449.     public static void main(String[] args) throws IOException {
  450.  
  451.         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  452.         int n = Integer.parseInt(in.readLine());
  453.         int num_edges = Integer.parseInt(in.readLine());
  454.  
  455.         Hashtable<String, Integer> vraboteni = new Hashtable<>(num_edges+1);
  456.         Graph<Integer> g = new Graph<>(n);
  457.  
  458.         for(int i = 0; i < num_edges; i++){
  459.             String line = in.readLine();
  460.             String pom[] = line.split(" ");
  461.  
  462.             int index1 = Integer.parseInt(pom[0]);
  463.             int index2 = Integer.parseInt(pom[2]);
  464.  
  465.             String covek1 = pom[1];
  466.             String covek2 = pom[3];
  467.             float tezina = Float.parseFloat(pom[4]);
  468.  
  469.             if(!vraboteni.contains(covek1)){
  470.                 vraboteni.put(covek1,index1);
  471.             }
  472.             if(!vraboteni.contains(pom[3])){
  473.                 vraboteni.put(covek2 , index2);
  474.             }
  475.             g.adjList[index1].setInfo(index1);
  476.             g.adjList[index2].setInfo(index2);
  477.             g.addEdge(index1,index2 , tezina);
  478.  
  479.         }
  480.  
  481.         String line = in.readLine();
  482.         int index = vraboteni.get(line);
  483.  
  484.         List<Edge> lista = g.prim(index);
  485.  
  486.         float sum = 0;
  487.         for(int i = 0; i < lista.size(); i++){
  488.            // System.out.println("From: " + lista.get(i).getFrom() + " To: " + lista.get(i).getTo() + " Weight " +lista.get(i).getWeight() );
  489.             sum += lista.get(i).getWeight();
  490.         }
  491.         System.out.println((int)sum);
  492.  
  493.     }
  494.  
  495. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement