import java.io.*;
import java.util.*;

//REMIND: Initial condx still suck!
//REMIND: Allow varying K per new node?  .. say [min..max]?

public class BAGraph extends Graph {
    int N;
    int N0;
    int K;
    ArrayList P;
    BAGraph (int N, int N0, int K) {
		super();
		this.N = N;
		this.N0 = N0;
		this.K = K;
		initGraph();
    }
    public void initGraph() {
		for (int i=0; i<N; i++)
			nodes.add(new Node(i));
		P = new ArrayList();
		for (int i=0; i<N0; i++)
			P.add(nodes.get(i));
		for (int i=N0; i<N; i++)
			linkNode(i);
		sortByDegree(true);
    }
    public void linkNode(int i) {
		Node n = (Node)nodes.get(i);
//		HashSet Q = new HashSet(); // Randomizes .. use TreeSet:
		TreeSet Q = new TreeSet();
		while (Q.size()<K) { //weeds out duplicates
			Q.add(P.get(randInt(P.size())));
		}
		for(Iterator it=Q.iterator();it.hasNext();){
			Node n1 = (Node)it.next();
			n.addEdge(n1);
			n1.addEdge(n);
			P.add(n1);
			P.add(n);
		}
    }
	// ---------------- Test Program
    public static void main (String args[]) {
		boolean print = false;
		int N=Integer.parseInt(arg(args, 0, "100"));
		if (N<=100) { // if < 100 or neg
			N=Math.abs(N);
			print=true;
		}
		int K=Integer.parseInt(arg(args, 1, "4"));
		int N0=Integer.parseInt(arg(args, 2, "8"));
		String name="Bag"+N+"-"+K+"-"+N0;
		System.out.println(name+": BAGraph N="+N+" K="+K+" N0="+N0);
		assert(N0 >= K, "N0 < K: N0="+N0+" K="+K);
		assert(N > K, "N <= K: N="+N+" K="+K);

		BAGraph g = new BAGraph(N, N0, K);
		if (print)
			g.printByLevel();
		g.printHist("Edge Histogram");
		g.printLevels("Levels Histogram");
    }
}

