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

    double[] val;
    int[] dad;

    int delay;
    Graphics page;

    GraphW(int N, double d)
      {
        this.N = N;
        adj = new double[N][N]; 
        p = new Point[N]; 
        p[0] = new Point(.001, .001);
        p[N-1] = new Point(.999, .999);
        for (int i = 1; i < N-1; i++)
          p[i] = new Point(Math.random(), Math.random());
        for (int i = 0; i < N; i++)
          for (int j = 0; j < N; j++)
            if (Point.distance(p[i], p[j]) < d)
                 adj[i][j] = Point.distance(p[i], p[j]);
            else adj[i][j] = 0;
      }
    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] > 0.0)
              drawEdge(p[i], p[j], Color.white);
      }
    double priority(int i, int j, int sw)
      { 
        if (sw == 3) return adj[i][j]; 
        if (sw == 4) return val[i] + adj[i][j]; 
        if (sw == 5) return val[i] + adj[i][j] + Point.distance(p[j], p[N-1]);
        return adj[i][j];
      }
    void pfs(int delay, int sw)
      { 
        this.delay = delay;
        visited = new boolean[N];
        dad = new int[N];
        val = new double[N];
        for (int i = 0; i < N; i++) 
          { visited[i] = false; val[i] = 1000.0; }
        dad[0] = 0; val[0] = 0.0;
        for (int k = 0, min = -1; k != -1; k = min, min = -1)
          {
            visited[k] = true; 
            if (val[k] > 999.0) val[k] = 0; 
            drawVertex(p[k], Color.red);
            drawEdge(p[dad[k]], p[k], Color.red);
            for (int i = 0; i < N; i++) 
              if (!visited[i]) 
                { 
                  if (adj[k][i] > 0.0) 
                    {
                      drawVertex(p[i], Color.black);
                      if (priority(k, i, sw) < val[i])
                        { val[i] = priority(k, i, sw); dad[i] = k; }
                    }
                  if (min == -1 || val[i] < val[min]) 
                    { min = i;  drawVertex(p[k], Color.red); }
                }
          }
      }
  }

