Advertisement
NHristovski

removeEdge

Apr 17th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.14 KB | None | 0 0
  1.  
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.HashMap;
  6. import java.util.HashSet;
  7. import java.util.Hashtable;
  8. import java.util.LinkedList;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.Objects;
  12. import java.util.PriorityQueue;
  13. import java.util.Queue;
  14. import java.util.Scanner;
  15. import java.util.Set;
  16. import java.util.stream.Collectors;
  17. import jdk.management.resource.ResourceType;
  18.  
  19.  
  20.  
  21. class FordFulkerson<E extends Comparable<E>>{
  22.  
  23. class BFS_FF<E extends Comparable<E>>{
  24.  
  25. public void run(Graph<E> g,E startingNode,boolean resetVisited){
  26. Hashtable<Vertex<E>, List<Edge<E>>> table = g.getHashtableOutEdges();
  27.  
  28. if (resetVisited){
  29. for(Vertex<E> vertex : g.getVertices()){
  30. vertex.setVisited(false);
  31. }
  32. }
  33.  
  34. for(Vertex<E> vertex : g.getVertices()){
  35. vertex.setMinDistance(Double.MAX_VALUE);
  36. }
  37.  
  38. Vertex<E> node = g.getVertex(startingNode);
  39. node.setMinDistance(0);
  40. node.setVisited(true);
  41. node.setMaxFlow(Double.MAX_VALUE);
  42. Queue<Vertex<E>> q = new LinkedList<>();
  43. q.offer(node);
  44.  
  45. while(!q.isEmpty()){
  46. Vertex<E> currentNode = q.poll();
  47.  
  48. List<Vertex<E>> adjNodes = new ArrayList<>();
  49. for (Edge<E> edge : table.get(currentNode)){
  50. if (edge.getTransferable() > 0d){
  51. adjNodes.add(edge.getDestination());
  52. }
  53. }
  54.  
  55. for (Vertex<E> ver : adjNodes){
  56. if (!ver.isVisited()){
  57. ver.setPredecessor(currentNode);
  58. ver.setMinDistance(currentNode.getMinDistance() + 1);
  59. ver.setVisited(true);
  60. ver.setMaxFlow(Math.min(currentNode.getMaxFlow(), g.getEdgeBetween(currentNode.getData(), ver.getData()).getTransferable()));
  61. q.offer(ver);
  62. }
  63. }
  64. }
  65. }
  66.  
  67. public void run(Graph<E> graph,Vertex<E> startingNode){
  68.  
  69. }
  70.  
  71.  
  72. }
  73. }
  74.  
  75. class DFS<E extends Comparable<E>>{
  76. int time;
  77. public DFS(){
  78. time = 0;
  79. }
  80.  
  81. private void visit(Vertex<E> u,Hashtable<Vertex<E>,List<Edge<E > > > table){
  82. u.setColor(Color.GRAY);
  83. time++;
  84. u.setTimeVisited(time);
  85.  
  86. Set<Vertex<E>> adjVertices = new HashSet<>();
  87. List<Edge<E>> adj = table.get(u);
  88. for (Edge<E> edge : adj){
  89. adjVertices.add(edge.getDestination());
  90. }
  91.  
  92. for (Vertex<E> ver : adjVertices){
  93. if (ver.getColor() == Color.WHITE){
  94. ver.setPredecessor(u);
  95. ver.setMinDistance(u.getMinDistance() + 1);
  96. visit(ver,table);
  97. }
  98. }
  99. u.setColor(Color.BLACK);
  100. time++;
  101. u.setTimeFinished(time);
  102. }
  103. public void run(Graph<E> g){
  104. this.time = 0;
  105. Hashtable<Vertex<E>,List<Edge<E>>> table = g.getHashtableOutEdges();
  106.  
  107. List<Vertex<E>> vertices = new ArrayList<>();
  108. vertices = g.getVertices();
  109.  
  110. for(Vertex<E> vertex : vertices){
  111. vertex.setColor(Color.WHITE);
  112. vertex.setMinDistance(0d);
  113. vertex.setPredecessor(null);
  114. }
  115.  
  116. for (Vertex<E> vertex : vertices){
  117. if (vertex.getColor() == Color.WHITE){
  118. visit(vertex,table);
  119. }
  120. }
  121. }
  122. }
  123.  
  124. class BFS<E extends Comparable<E>>{
  125.  
  126. public void run(Graph<E> g,E startingNode,boolean resetVisited){
  127. Hashtable<Vertex<E>, List<Edge<E>>> table = g.getHashtableOutEdges();
  128.  
  129. if (resetVisited){
  130. for(Vertex<E> vertex : g.getVertices()){
  131. vertex.setVisited(false);
  132. }
  133. }
  134.  
  135. for(Vertex<E> vertex : g.getVertices()){
  136. vertex.setMinDistance(Double.MAX_VALUE);
  137. }
  138.  
  139. Vertex<E> node = g.getVertex(startingNode);
  140. node.setMinDistance(0);
  141. node.setVisited(true);
  142. Queue<Vertex<E>> q = new LinkedList<>();
  143. q.offer(node);
  144.  
  145. while(!q.isEmpty()){
  146. Vertex<E> currentNode = q.poll();
  147.  
  148. List<Vertex<E>> adjNodes = new ArrayList<>();
  149. for (Edge<E> edge : table.get(currentNode)){
  150. adjNodes.add(edge.getDestination());
  151. }
  152.  
  153. for (Vertex<E> ver : adjNodes){
  154. if (!ver.isVisited()){
  155. ver.setPredecessor(currentNode);
  156. ver.setMinDistance(currentNode.getMinDistance() + 1);
  157. ver.setVisited(true);
  158. q.offer(ver);
  159. }
  160. }
  161. }
  162. }
  163.  
  164.  
  165. }
  166.  
  167. enum Color{
  168. UNDEFINED,
  169. WHITE,
  170. GRAY,
  171. BLACK
  172. }
  173. class Vertex<E extends Comparable<E>> implements Comparable<Vertex<E>>{
  174. private E data;
  175. private double minDistance;
  176. private Vertex predecessor;
  177. private Color color;
  178. private Integer timeVisited;
  179. private Integer timeFinished;
  180. boolean visited;
  181. double maxFlow;
  182.  
  183. public double getMaxFlow() {
  184. return maxFlow;
  185. }
  186.  
  187. public void setMaxFlow(double maxFlow) {
  188. this.maxFlow = maxFlow;
  189. }
  190.  
  191. public boolean isVisited() {
  192. return visited;
  193. }
  194.  
  195. public void setVisited(boolean visited) {
  196. this.visited = visited;
  197. }
  198.  
  199. public Vertex(E data){
  200. this.data = data;
  201. this.minDistance = Double.MAX_VALUE;
  202. this.predecessor = null;
  203. color = Color.UNDEFINED;
  204. timeVisited = null;
  205. timeFinished = null;
  206. visited = false;
  207. maxFlow = 0d;
  208. }
  209.  
  210. public Integer getTimeVisited() {
  211. return timeVisited;
  212. }
  213.  
  214. public void setTimeVisited(Integer timeVisited) {
  215. this.timeVisited = timeVisited;
  216. }
  217.  
  218. public Integer getTimeFinished() {
  219. return timeFinished;
  220. }
  221.  
  222. public void setTimeFinished(Integer timeFinished) {
  223. this.timeFinished = timeFinished;
  224. }
  225.  
  226. public Color getColor() {
  227. return color;
  228. }
  229.  
  230. public void setColor(Color color) {
  231. this.color = color;
  232. }
  233.  
  234. public boolean hasPredecessor(){
  235. return this.predecessor != null;
  236. }
  237.  
  238. public double getMinDistance() {
  239. return minDistance;
  240. }
  241.  
  242. public void setMinDistance(double minDistance) {
  243. this.minDistance = minDistance;
  244. }
  245.  
  246. public Vertex<E> getPredecessor() {
  247. return predecessor;
  248. }
  249.  
  250. public void setPredecessor(Vertex predecessor) {
  251. this.predecessor = predecessor;
  252. }
  253.  
  254. public E getData() {
  255. return data;
  256. }
  257.  
  258. public void setData(E data) {
  259. this.data = data;
  260. }
  261.  
  262. @Override
  263. public int compareTo(Vertex<E> v) {
  264. return Double.compare(minDistance, v.getMinDistance());
  265. }
  266.  
  267. @Override
  268. public int hashCode() {
  269. int hash = 3;
  270. hash = 29 * hash + Objects.hashCode(this.data);
  271. return hash;
  272. }
  273.  
  274. @Override
  275. public boolean equals(Object obj) {
  276. if (this == obj) {
  277. return true;
  278. }
  279. if (obj == null) {
  280. return false;
  281. }
  282. if (getClass() != obj.getClass()) {
  283. return false;
  284. }
  285. final Vertex<E> other = (Vertex<E>) obj;
  286. if (!this.data.equals(other.data)) {
  287. return false;
  288. }
  289. return true;
  290. }
  291.  
  292. @Override
  293. public String toString(){
  294. return "Vertex " + this.getData();
  295. }
  296.  
  297. public String toStringMoreInfo(){
  298. StringBuilder sb = new StringBuilder();
  299. sb.append("Vertex with data: ")
  300. .append(this.data)
  301. .append(" minDist: ");
  302. if (this.minDistance == Double.MAX_VALUE || this.minDistance == Double.MAX_VALUE / 2){
  303. sb.append("INF");
  304. }else{
  305. sb.append(this.minDistance);
  306. }
  307.  
  308. sb.append("\tvisited: " + timeVisited + " - left: " + timeFinished);
  309. sb.append(" COLOR: " + this.color);
  310. return sb.toString();
  311. }
  312.  
  313. }
  314.  
  315. class Edge<E extends Comparable<E>> implements Comparable<Edge<E>>{
  316. private Vertex<E> source;
  317. private Vertex<E> destination;
  318. private double weight;
  319. private double transferable;
  320.  
  321.  
  322. public Edge(Vertex<E> source, Vertex<E> destination, double weight) {
  323. this.source = source;
  324. this.destination = destination;
  325. this.weight = weight;
  326. this.transferable = weight;
  327. }
  328.  
  329. public double getTransferable() {
  330. return transferable;
  331. }
  332.  
  333. public void setTransferable(double transferable) {
  334. this.transferable = transferable;
  335. }
  336.  
  337. public void decreaseTransferable(double amount){
  338. this.transferable -= amount;
  339. }
  340.  
  341. public Vertex<E> getSource() {
  342. return source;
  343. }
  344.  
  345. public void setSource(Vertex<E> source) {
  346. this.source = source;
  347. }
  348.  
  349. public Vertex<E> getDestination() {
  350. return destination;
  351. }
  352.  
  353. public void setDestination(Vertex<E> destination) {
  354. this.destination = destination;
  355. }
  356.  
  357. public double getWeight() {
  358. return weight;
  359. }
  360.  
  361. public void setWeight(double weight) {
  362. this.weight = weight;
  363. }
  364.  
  365. public void changeDirection(){
  366. Vertex<E> source = this.getSource();
  367. Vertex<E> destination = this.getDestination();
  368.  
  369. this.setDestination(source);
  370. this.setSource(destination);
  371. }
  372. @Override
  373. public String toString(){
  374. StringBuilder sb = new StringBuilder();
  375. sb.append("Edge from: ")
  376. .append(this.source.getData())
  377. .append("\tto: ")
  378. .append(this.destination.getData())
  379. .append("\twith weight: " + this.weight);
  380. return sb.toString();
  381. }
  382.  
  383. @Override
  384. public int compareTo(Edge<E> edge) {
  385. return Double.compare(this.weight, edge.weight);
  386. }
  387.  
  388. @Override
  389. public int hashCode() {
  390. int hash = 7;
  391. hash = 97 * hash + Objects.hashCode(this.source);
  392. hash = 97 * hash + Objects.hashCode(this.destination);
  393. hash = 97 * hash + (int) (Double.doubleToLongBits(this.weight) ^ (Double.doubleToLongBits(this.weight) >>> 32));
  394. return hash;
  395. }
  396.  
  397. @Override
  398. public boolean equals(Object obj) {
  399. if (this == obj) {
  400. return true;
  401. }
  402. if (obj == null) {
  403. return false;
  404. }
  405. if (getClass() != obj.getClass()) {
  406. return false;
  407. }
  408. final Edge<?> other = (Edge<?>) obj;
  409.  
  410. if (!Objects.equals(this.source, other.source)) {
  411. return false;
  412. }
  413. if (!Objects.equals(this.destination, other.destination)) {
  414. return false;
  415. }
  416. return true;
  417. }
  418.  
  419.  
  420.  
  421.  
  422. }
  423.  
  424. class Graph<E extends Comparable<E>>{
  425.  
  426. List<Vertex<E>> vertices;
  427. List<Edge<E>> edges;
  428. Map<E,Integer> indexes; // E( name of the vertex) -> Integer (position in list vertices)
  429. Map<String,Edge<E>> hashedEdges;
  430.  
  431. public Graph(){
  432. vertices = new ArrayList<>();
  433. edges = new ArrayList<>();
  434. indexes = new HashMap<>();
  435. hashedEdges = new HashMap<>();
  436. }
  437.  
  438. public void addVertex(E data){
  439. Vertex<E> vertex = new Vertex<>(data);
  440. vertices.add(vertex);
  441. int index = vertices.size() - 1;
  442. indexes.put(data, index);
  443. }
  444. public boolean removeVertex(E data){
  445. Vertex<E> v = new Vertex<>(data);
  446. if (vertices.contains(v)){
  447. Vertex<E> vertexToRemove = this.getVertex(data);
  448. vertices.remove(vertexToRemove);
  449. for (int i = 0; i < this.edges.size(); i++){
  450. if (edges.get(i).getSource().equals(vertexToRemove) || edges.get(i).getDestination().equals(vertexToRemove)){
  451. this.edges.remove(edges.get(i));
  452. i--;
  453. }
  454. }
  455. return true;
  456. }
  457. return false;
  458. }
  459.  
  460. public Vertex<E> getVertex(E data){
  461. return vertices.get(indexes.get(data));
  462. }
  463.  
  464. private boolean addEdge(Vertex<E> source,Vertex<E> destination,double weight){
  465. Edge<E> edge = new Edge<E>(source,destination,weight);
  466. hashedEdges.put(source.getData() + "-" + destination.getData(),edge);
  467. return edges.add(edge);
  468. }
  469.  
  470. public boolean removeDirectedEdge(Edge<E> edge){
  471. return edges.remove(edge);
  472. }
  473. public boolean removeUndirectedEdge(Edge<E> edge){
  474. Edge<E> secondEdge = new Edge<>(edge.getDestination(),edge.getSource(),edge.getWeight());
  475. return edges.remove(edge) && edges.remove(secondEdge);
  476. }
  477.  
  478. public boolean addDirectedEdge(E source,E destination,double weight){
  479. Vertex<E> s = vertices.get(indexes.get(source));
  480. Vertex<E> d = vertices.get(indexes.get(destination));
  481. return addEdge(s,d,weight);
  482. }
  483. public boolean addUndirectedEdge(E source,E destination,double weight){
  484. Vertex<E> s = vertices.get(indexes.get(source));
  485. Vertex<E> d = vertices.get(indexes.get(destination));
  486.  
  487. return addEdge(s,d,weight) && addEdge(d,s,weight);
  488. }
  489.  
  490. public List<Vertex<E>> getVertices(){
  491. return this.vertices;
  492. }
  493.  
  494. public List<Edge<E>> getEdges(){
  495. return this.edges;
  496. }
  497.  
  498. public Edge<E> getEdgeBetween(E source,E destination){
  499. return hashedEdges.get(source + "-" + destination);
  500. }
  501.  
  502. @Override
  503. public String toString(){
  504. StringBuilder sb = new StringBuilder();
  505. sb.append("Vertices:\n");
  506. for (Vertex<E> v : this.getVertices()){
  507. sb.append(v.toString() + "\n");
  508. }
  509.  
  510. sb.append("\n").append("Edges:\n");
  511. for (Edge<E> e : this.getEdges()){
  512. sb.append(e.toString()).append("\n");
  513. }
  514.  
  515. return sb.toString();
  516. }
  517.  
  518.  
  519. /**
  520. * Hashtable of Node and list of Edges that start from Node
  521. *
  522. * @return Hashtable
  523. */
  524. public Hashtable<Vertex<E>, List<Edge<E> > > getHashtableOutEdges(){
  525. Hashtable<Vertex<E>, List<Edge<E> > > table = new Hashtable<>();
  526. List<Edge<E>> lst;
  527. for (Vertex<E> v : this.vertices){
  528. lst = new LinkedList<>();
  529. table.put(v,lst);
  530. }
  531.  
  532. for (Edge<E> e : this.edges){
  533. table.get(e.getSource()).add(e);
  534. }
  535.  
  536. return table;
  537. }
  538.  
  539. /**
  540. *
  541. * Hashtable of Node and list of Edges that go in Node
  542. *
  543. * @return Hashtable<Node,Edges that go in Node>
  544. */
  545.  
  546. public Hashtable<Vertex<E>, List<Edge<E> > > getHashtableInEdges(){
  547. Hashtable<Vertex<E>, List<Edge<E> > > table = new Hashtable<>();
  548. List<Edge<E>> lst;
  549. for (Vertex<E> v : this.vertices){
  550. lst = new LinkedList<>();
  551. table.put(v,lst);
  552. }
  553.  
  554. for (Edge<E> e : this.edges){
  555. table.get(e.getDestination()).add(e);
  556. }
  557.  
  558. return table;
  559. }
  560.  
  561. }
  562.  
  563. public class Main{
  564.  
  565. public static void main(String[] args){
  566. Graph<String> g = new Graph<>();
  567.  
  568. g.addVertex("A");
  569. g.addVertex("B");
  570. g.addVertex("C");
  571. g.addVertex("D");
  572. g.addVertex("E");
  573. g.addVertex("F");
  574. g.addVertex("G");
  575. g.addVertex("H");
  576.  
  577. g.addDirectedEdge("B", "E", 1);
  578. g.addDirectedEdge("E", "F", 1);
  579. g.addDirectedEdge("E", "G", 1);
  580. g.addDirectedEdge("E", "H", 1);
  581. g.addDirectedEdge("A", "B", 1);
  582. g.addDirectedEdge("A", "C", 1);
  583. g.addDirectedEdge("A", "F", 1);
  584. g.addDirectedEdge("F", "G", 1);
  585. g.addDirectedEdge("C", "D", 1);
  586. g.addDirectedEdge("D", "H", 1);
  587. g.addDirectedEdge("H", "G", 1);
  588. g.addUndirectedEdge("H", "G", 2);
  589.  
  590. System.out.println(g);
  591. g.removeUndirectedEdge(new Edge<String>(g.getVertex("B"),g.getVertex("E"),1));
  592. System.out.println(g);
  593.  
  594. /* Graph<String> graph = new Graph<>();
  595.  
  596. graph.addVertex("C");
  597. graph.addVertex("B");
  598. graph.addVertex("A");
  599. graph.addVertex("D");
  600. graph.addVertex("E");
  601. graph.addVertex("F");
  602. graph.addVertex("G");
  603. graph.addVertex("H");
  604. graph.addVertex("I");
  605. graph.addVertex("J");
  606.  
  607. graph.addDirectedEdge("I", "C", 1);
  608. graph.addDirectedEdge("J", "E", 1);
  609. graph.addDirectedEdge("D", "I", 1);
  610. graph.addDirectedEdge("D", "C", 1);
  611. graph.addDirectedEdge("A", "B", 1);
  612. graph.addDirectedEdge("B", "A", 1);
  613. graph.addDirectedEdge("D", "B", 1);
  614.  
  615. System.out.println(graph.getHashtableInEdges());
  616. System.out.println(graph.getHashtableOutEdges()); */
  617.  
  618. }
  619. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement