School Commit Init

This commit is contained in:
2024-08-31 12:07:21 +03:00
commit 0b130ee18c
2801 changed files with 4720552 additions and 0 deletions
@@ -0,0 +1,160 @@
package DirectedGraphJava;
import java.util.HashSet;
import java.util.HashMap;
import java.util.Iterator;
public class DirectedGraph implements IDirectedGraph {
private HashSet<Integer> _vertices = new HashSet<Integer>();
private HashMap<Integer, HashSet<Integer>> _inbounds = new HashMap<Integer, HashSet<Integer>>();
private HashMap<Integer, HashSet<Integer>> _outbounds = new HashMap<Integer, HashSet<Integer>>();
private HashMap<Pair<Integer,Integer>,Integer> _edges = new HashMap<Pair<Integer,Integer>,Integer>();
public DirectedGraph() {
//nothing to do
}
public DirectedGraph reindex(){
HashMap<Integer,Integer> oldToNew = new HashMap<Integer,Integer>();
int i = 0;
for (Integer vertex : _vertices) {
oldToNew.put(vertex,i);
i++;
}
DirectedGraph newGraph = new DirectedGraph();
for (Integer vertex : _vertices) {
newGraph.addVertex(oldToNew.get(vertex));
}
for (Pair<Integer,Integer> edge : _edges.keySet()) {
newGraph.addEdge(oldToNew.get(edge.first),oldToNew.get(edge.second),_edges.get(edge));
}
return newGraph;
}
public Integer numVertices() {
return _vertices.size();
}
public Integer numEdges() {
return _edges.size();
}
public Iterator<Integer> vertices() {
return _vertices.iterator();
}
public Iterator<Pair<Pair<Integer,Integer>,Integer>> edges() {
HashSet<Pair<Pair<Integer,Integer>,Integer>> keyValues = new HashSet<Pair<Pair<Integer,Integer>,Integer>>();
for (Pair<Integer,Integer> key : this._edges.keySet()) {
Pair<Pair<Integer,Integer>,Integer> keyValuePair = new Pair<Pair<Integer,Integer>,Integer>(key,this._edges.get(key));
keyValues.add(keyValuePair);
}
return keyValues.iterator();
}
public boolean isEdge(Integer v1, Integer v2) {
if(!_vertices.contains(v1) || !_vertices.contains(v2)) {
throw new IllegalArgumentException("Vertex does not exist");
}
return _edges.containsKey(new Pair<Integer,Integer>(v1,v2));
}
public int inDegree(Integer v) {
if(!_vertices.contains(v)) {
throw new IllegalArgumentException("Vertex does not exist");
}
return _inbounds.get(v).size();
}
public int outDegree(Integer v) {
if(!_vertices.contains(v)) {
throw new IllegalArgumentException("Vertex does not exist");
}
return _outbounds.get(v).size();
}
public Iterator<Integer> inbounds(Integer v) {
if(!_vertices.contains(v)) {
throw new IllegalArgumentException("Vertex does not exist");
}
return _inbounds.get(v).iterator();
}
public Iterator<Integer> outbounds(Integer v) {
if(!_vertices.contains(v)) {
throw new IllegalArgumentException("Vertex does not exist");
}
return _outbounds.get(v).iterator();
}
public Integer weight(Integer v1, Integer v2) {
if(!_vertices.contains(v1) || !_vertices.contains(v2)) {
throw new IllegalArgumentException("Vertex does not exist");
}
if(!_edges.containsKey(new Pair<Integer,Integer>(v1,v2))) {
throw new IllegalArgumentException("Edge does not exist");
}
return _edges.get(new Pair<Integer,Integer>(v1,v2));
}
public void weight(Integer v1, Integer v2, Integer w) {
if(!_vertices.contains(v1) || !_vertices.contains(v2)) {
throw new IllegalArgumentException("Vertex does not exist");
}
if(!_edges.containsKey(new Pair<Integer,Integer>(v1,v2))) {
throw new IllegalArgumentException("Edge does not exist");
}
_edges.put(new Pair<Integer,Integer>(v1,v2),w);
}
public void addVertex(Integer v) {
if(_vertices.contains(v)) {
throw new IllegalArgumentException("Vertex already exists");
}
_vertices.add(v);
_inbounds.put(v,new HashSet<Integer>());
_outbounds.put(v,new HashSet<Integer>());
}
public void removeVertex(Integer v) {
if(!_vertices.contains(v)) {
throw new IllegalArgumentException("Vertex does not exist");
}
_vertices.remove(v);
for (Integer vertex : _inbounds.get(v)) {
_outbounds.get(vertex).remove(v);
_edges.remove(new Pair<Integer,Integer>(vertex,v));
}
for (Integer vertex : _outbounds.get(v)) {
_inbounds.get(vertex).remove(v);
_edges.remove(new Pair<Integer,Integer>(v,vertex));
}
_inbounds.remove(v);
_outbounds.remove(v);
}
public void addEdge(Integer v1, Integer v2, Integer w) {
if(!_vertices.contains(v1) || !_vertices.contains(v2)) {
throw new IllegalArgumentException("Vertex does not exist");
}
if(_edges.containsKey(new Pair<Integer,Integer>(v1,v2))) {
throw new IllegalArgumentException("Edge already exists");
}
_edges.put(new Pair<Integer,Integer>(v1,v2),w);
_inbounds.get(v2).add(v1);
_outbounds.get(v1).add(v2);
}
public void removeEdge(Integer v1, Integer v2) {
if(!_vertices.contains(v1) || !_vertices.contains(v2)) {
throw new IllegalArgumentException("Vertex does not exist");
}
if(!_edges.containsKey(new Pair<Integer,Integer>(v1,v2))) {
throw new IllegalArgumentException("Edge does not exist");
}
_edges.remove(new Pair<Integer,Integer>(v1,v2));
_inbounds.get(v2).remove(v1);
_outbounds.get(v1).remove(v2);
}
}
@@ -0,0 +1,22 @@
package DirectedGraphJava;
import java.util.Iterator;
interface IDirectedGraph {
public DirectedGraph reindex();
public Integer numVertices();
public Integer numEdges();
public Iterator<Integer> vertices();
public Iterator<Pair<Pair<Integer,Integer>,Integer>> edges();
public boolean isEdge(Integer v1, Integer v2);
public int inDegree(Integer v);
public int outDegree(Integer v);
public Iterator<Integer> inbounds(Integer v);
public Iterator<Integer> outbounds(Integer v);
public Integer weight(Integer v1, Integer v2);
public void weight(Integer v1, Integer v2, Integer w);
public void addVertex(Integer v);
public void removeVertex(Integer v);
public void addEdge(Integer v1, Integer v2, Integer w);
public void removeEdge(Integer v1, Integer v2);
}
@@ -0,0 +1,68 @@
package DirectedGraphJava;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
public class Main {
public static DirectedGraph read_from_file(String filename) throws FileNotFoundException {
DirectedGraph graph = new DirectedGraph();
File file = new File(filename);
Scanner scanner = new Scanner(file);
Integer num_vertices = scanner.nextInt();
for(Integer i = 0; i < num_vertices; i++)
graph.addVertex(i);
Integer num_edges = scanner.nextInt();
for(Integer i = 0; i < num_edges; i++){
Integer v1 = scanner.nextInt();
Integer v2 = scanner.nextInt();
Integer w = scanner.nextInt();
graph.addEdge(v1, v2, w);
}
scanner.close();
return graph;
}
public static void write_to_file(DirectedGraph graph, String filename) throws IOException {
DirectedGraph new_graph = graph.reindex();
File file = new File(filename);
file.createNewFile();
FileWriter writer = new FileWriter(file);
writer.write(new_graph.numVertices().toString() + " " + new_graph.numEdges().toString() + "\n");
for(Iterator<Pair<Pair<Integer, Integer>,Integer>> edge = new_graph.edges(); edge.hasNext();){
Pair<Pair<Integer, Integer>,Integer> e = edge.next();
writer.write(e.first.first.toString() + " " + e.first.second.toString() + " " + e.second.toString() + "\n");
}
writer.close();
}
public static DirectedGraph random_graph(Integer num_vertices, Integer num_edges) {
DirectedGraph graph = new DirectedGraph();
for(Integer i = 0; i < num_vertices; i++)
graph.addVertex(i);
for(Integer i = 0; i < num_edges; i++){
Integer v1 = (int)(Math.random() * num_vertices);
Integer v2 = (int)(Math.random() * num_vertices);
Integer w = (int)(Math.random() * 100);
if(graph.isEdge(v1, v2)){
i--;
continue;
}
graph.addEdge(v1, v2, w);
}
return graph;
}
public static void main(String[] args) {
ui UI = new ui();
UI.run();
}
}
@@ -0,0 +1,30 @@
package DirectedGraphJava;
public class Pair<T1,T2> {
public T1 first;
public T2 second;
public Pair(T1 first, T2 second) {
this.first = first;
this.second = second;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Pair<?, ?> pair = (Pair<?, ?>) o;
if (first != null ? !first.equals(pair.first) : pair.first != null) return false;
return second != null ? second.equals(pair.second) : pair.second == null;
}
@Override
public int hashCode() {
int result = first != null ? first.hashCode() : 0;
result = 31 * result + (second != null ? second.hashCode() : 0);
return result;
}
}
@@ -0,0 +1,260 @@
package DirectedGraphJava;
import java.util.Iterator;
public class ui {
private DirectedGraph graph = new DirectedGraph();
public ui(){
}
public void run(){
Integer command;
while(true){
if(this.graph.numVertices() == 0)
System.out.println("Graph is empty");
System.out.println();
System.out.println("1. Load graph from file");
System.out.println("2. Save graph to file");
System.out.println("3. Generate a graph");
System.out.println("4. Add a vertex");
System.out.println("5. Remove a vertex");
System.out.println("6. Add an edge");
System.out.println("7. Remove an edge");
System.out.println("8. Get in degree");
System.out.println("9. Get out degree");
System.out.println("10 Get cost");
System.out.println("11. Set cost");
System.out.println("12. Get number of vertices");
System.out.println("13. Get number of edges");
System.out.println("14. Get vertices");
System.out.println("15. Get edges");
System.out.println("16. Get inbounds");
System.out.println("17. Get outbounds");
System.out.println("18. Futeti-l");
System.out.println("0. Exit");
System.out.print("Command: ");
command = Integer.parseInt(System.console().readLine());
System.out.println();
switch(command){
case 1: {
System.out.print("File name: ");
String fileName = System.console().readLine();
try{
this.graph = Main.read_from_file(fileName);
}
catch(Exception e){
System.out.println("Error: " + e.getMessage());
}
break;
}
case 2: {
System.out.print("File name: ");
String fileName = System.console().readLine();
try{
Main.write_to_file(this.graph, fileName);
}
catch(Exception e){
System.out.println("Error: " + e.getMessage());
}
break;
}
case 3: {
System.out.print("Number of vertices: ");
Integer numVertices = Integer.parseInt(System.console().readLine());
System.out.print("Number of edges: ");
Integer numEdges = Integer.parseInt(System.console().readLine());
try{
this.graph = Main.random_graph(numVertices, numEdges);
}
catch(Exception e){
System.out.println("Error: " + e.getMessage());
}
break;
}
case 4: {
System.out.print("Vertex: ");
Integer vertex = Integer.parseInt(System.console().readLine());
try{
this.graph.addVertex(vertex);
}
catch(Exception e){
System.out.println("Error: " + e.getMessage());
}
break;
}
case 5: {
System.out.print("Vertex: ");
Integer vertex = Integer.parseInt(System.console().readLine());
try{
this.graph.removeVertex(vertex);
}
catch(Exception e){
System.out.println("Error: " + e.getMessage());
}
break;
}
case 6: {
System.out.print("Vertex 1: ");
Integer vertex1 = Integer.parseInt(System.console().readLine());
System.out.print("Vertex 2: ");
Integer vertex2 = Integer.parseInt(System.console().readLine());
System.out.print("Weight: ");
Integer weight = Integer.parseInt(System.console().readLine());
try{
this.graph.addEdge(vertex1, vertex2, weight);
}
catch(Exception e){
System.out.println("Error: " + e.getMessage());
}
break;
}
case 7: {
System.out.print("Vertex 1: ");
Integer vertex1 = Integer.parseInt(System.console().readLine());
System.out.print("Vertex 2: ");
Integer vertex2 = Integer.parseInt(System.console().readLine());
try{
this.graph.removeEdge(vertex1, vertex2);
}
catch(Exception e){
System.out.println("Error: " + e.getMessage());
}
break;
}
case 8: {
System.out.print("Vertex: ");
Integer vertex = Integer.parseInt(System.console().readLine());
try{
System.out.println("In degree: " + this.graph.inDegree(vertex));
}
catch(Exception e){
System.out.println("Error: " + e.getMessage());
}
break;
}
case 9: {
System.out.print("Vertex: ");
Integer vertex = Integer.parseInt(System.console().readLine());
try{
System.out.println("Out degree: " + this.graph.outDegree(vertex));
}
catch(Exception e){
System.out.println("Error: " + e.getMessage());
}
break;
}
case 10: {
System.out.print("Vertex 1: ");
Integer vertex1 = Integer.parseInt(System.console().readLine());
System.out.print("Vertex 2: ");
Integer vertex2 = Integer.parseInt(System.console().readLine());
try{
System.out.println("Cost: " + this.graph.weight(vertex1, vertex2));
}
catch(Exception e){
System.out.println("Error: " + e.getMessage());
}
break;
}
case 11: {
System.out.print("Vertex 1: ");
Integer vertex1 = Integer.parseInt(System.console().readLine());
System.out.print("Vertex 2: ");
Integer vertex2 = Integer.parseInt(System.console().readLine());
System.out.print("Weight: ");
Integer weight = Integer.parseInt(System.console().readLine());
try{
this.graph.weight(vertex1, vertex2, weight);
}
catch(Exception e){
System.out.println("Error: " + e.getMessage());
}
break;
}
case 12: {
System.out.println("Number of vertices: " + this.graph.numVertices());
break;
}
case 13: {
System.out.println("Number of edges: " + this.graph.numEdges());
break;
}
case 14: {
System.out.println("Vertices: ");
for(Iterator<Integer> vertex = this.graph.vertices(); vertex.hasNext();){
System.out.println(vertex.next());
}
break;
}
case 15: {
System.out.println("Edges: ");
for(Iterator<Pair<Pair<Integer, Integer>,Integer>> edge = this.graph.edges(); edge.hasNext();){
Pair<Pair<Integer, Integer>,Integer> e = edge.next();
System.out.println(e.first.first + " " + e.first.second + " " + e.second);
}
break;
}
case 16: {
System.out.print("Vertex: ");
Integer vertex = Integer.parseInt(System.console().readLine());
System.out.println("Inbounds: ");
for(Iterator<Integer> inbounds = this.graph.inbounds(vertex); inbounds.hasNext();){
Integer e = inbounds.next();
System.out.println(e);
}
break;
}
case 17: {
System.out.print("Vertex: ");
Integer vertex = Integer.parseInt(System.console().readLine());
System.out.println("Outbounds: ");
for(Iterator<Integer> outbounds = this.graph.outbounds(vertex); outbounds.hasNext();){
Integer e = outbounds.next();
System.out.println(e);
}
break;
}
case 18:{
System.out.println("Inbounds: ");
for(Iterator<Integer> vertex = this.graph.vertices(); vertex.hasNext();){
Integer v = vertex.next();
System.out.print(v);
System.out.print(": ");
for(Iterator<Integer> inbounds = this.graph.inbounds(v); inbounds.hasNext();){
Integer e = inbounds.next();
System.out.print(e);
System.out.print(" ");
}
System.out.println();
}
System.out.println();
System.out.println("Outbounds: ");
for(Iterator<Integer> vertex = this.graph.vertices(); vertex.hasNext();){
Integer v = vertex.next();
System.out.print(v);
System.out.print(": ");
for(Iterator<Integer> outbounds = this.graph.outbounds(v); outbounds.hasNext();){
Integer e = outbounds.next();
System.out.print(e);
System.out.print(" ");
}
System.out.println();
}
System.out.println();
System.out.println("Edges: ");
for(Iterator<Pair<Pair<Integer, Integer>,Integer>> edge = this.graph.edges(); edge.hasNext();){
Pair<Pair<Integer, Integer>,Integer> e = edge.next();
System.out.println(e.first.first + " " + e.first.second + " " + e.second);
}
break;
}
case 0:{
System.exit(0);
}
default: {
System.out.println("Invalid option");
break;
}
}
}
}
}