import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;

//mgraph1a
public class Graph {

  protected HashSet<Vertex> vertices;
  protected HashSet<Edge> edges;

  public Graph() {
    vertices = new HashSet<Vertex>();
    edges = new HashSet<Edge>();
  }

  public Graph(HashSet<Vertex> vertices, HashSet<Edge> edges) {
    this.vertices = vertices;
    this.edges = edges;
  }

  @Override
  public String toString() {
    ArrayList<Vertex> temp = new ArrayList<>(this.vertices);
    Collections.sort(temp);
    StringBuilder erg = new StringBuilder();
    for (int i = 0; i < temp.size(); i++) {
      Vertex currentVertex = temp.get(i);
      erg.append(currentVertex.id + ":  ");
      for (int j = 0; j < temp.size(); j++) {
        Vertex maybeNeighbor = temp.get(j);
        Edge e = new Edge(currentVertex,maybeNeighbor);
        if (this.edges.contains(e)) {
          erg.append("1 ");
        } else {
          erg.append("0 ");
        }
      }
      erg.append("\n");
    }
    return erg.toString();
  }
//mgraph1e

        /** testen, ob Knoten in einer Menge funktionieren */
  public static void main(String[] args) {
    // erst mit 2 Knoten:
//mgraphmainvorgabea
    Vertex v2 = new Vertex(2);
    Vertex v1 = new Vertex(1);
    HashSet<Vertex> tempV = new HashSet<Vertex>();
    tempV.add(v2);
    tempV.add(v1);

    Edge e1 = new Edge(v1,v2);
    HashSet<Edge> tempE = new HashSet<Edge>();
    tempE.add(e1);

    Graph test = new Graph(tempV,tempE);
    System.out.println(test);
//mgraphmainvorgabee

    // nun mit einem 3. Knoten:
    Vertex v3 = new Vertex(3);
    Edge e2 = new Edge(v2,v3);
    Edge e3 = new Edge(v3,v1);
    test.vertices.add(v3);
    test.edges.add(e2);
    test.edges.add(e3);

    System.out.println(test);
  }

//mgraph2a
}
//mgraph2e

