import java.awt.*;
import Point;
import Queue;
class Graph
  {
    int N;
    boolean[][] adj;
    Point[] p;
    boolean[] visited;

    int delay;
    Graphics page;

    Graph(int N, double d)
      {
        this.N = N;
        adj = new boolean[N][N]; 
        p = new Point[N]; 
        for (int i = 0; i < N; i++)
          p[i] = new Point(Math.random(), Math.random());
        for (int i = 0; i < N; i++)
          for (int j = 0; j < N; j++)
            adj[i][j] = false;
        for (int i = 0; i < N; i++)
          for (int j = i+1; j < N; j++)
            if (Point.distance(p[i], p[j]) < d)
              { adj[j][i] = true; adj[i][j] = true; }
      }
    void drawVertex(Point p, Color c)
      { 
        int h = page.getClipRect().height;
        int w = page.getClipRect().width;
        page.setColor(c);
        for (int j = 0; j < delay; j++)
          page.fillOval( (int) (h*p.x)-3, (int) (w*p.y)-3, 6, 6);
      }
    void drawEdge(Point p, Point q, Color c)
      { 
        int h = page.getClipRect().height;
        int w = page.getClipRect().width;
        page.setColor(c);
        for (int j = 0; j < delay; j++)
          page.drawLine( (int) (h*p.x), (int) (w*p.y), 
                         (int) (h*q.x), (int) (w*q.y));
      }
    void paint(Graphics page)
      {
        this.page = page; this.delay = 1;
        for (int i = 0; i < this.N; i++)
          drawVertex(p[i], Color.white);
        for (int i = 0; i < N; i++)
          for (int j = i+1; j < N; j++)
            if (adj[i][j])
              drawEdge(p[i], p[j], Color.white);
      }
    void dfsR(int k)
      { 
        visited[k] = true; drawVertex(this.p[k], Color.black);
        for (int i = 0; i < N; i++)
          if (adj[k][i])
             if (!visited[i]) 
                { 
                  drawEdge(p[k], p[i], Color.red);
                  dfsR(i); 
                }
        drawVertex(p[k], Color.red);
      }
    void dfs(int delay)
      { 
        this.delay = delay;
        visited = new boolean[N];
        for (int i = 0; i < N; i++) visited[i] = false;
        dfsR(0);
      }
    void bfs(int delay)
      { int k;
        this.delay = delay;
        visited = new boolean[N];
        for (int i = 0; i < N; i++) visited[i] = false;
        Queue fringe = new Queue(N);
        fringe.put(0); drawVertex(p[0], Color.black);
        while (!fringe.empty())
          if (!visited[k = fringe.get()])
            {
              visited[k] = true; drawVertex(p[k], Color.red);
              for (int i = 0; i < N; i++) 
                if (adj[k][i])
                  if (!visited[i]) 
                    { 
                      drawEdge(p[k], p[i], Color.red);
                      fringe.put(i); drawVertex(p[i], Color.black);
                    }
            }
      }
  }

