import java.util.*;

public class Verkkotutkimus {
    public static long yhteensa = 0;
    public static long yhtenaiset = 0;
    public static long eulerit = 0;
    public static long hamiltonit = 0;

    public static ArrayList<Verkko> varasto = new ArrayList<Verkko>();

    public static void laskeVerkot(Verkko verkko, int alku, int loppu, int raja) {
        if (loppu > raja) {
            for (Verkko vanha : varasto) {
                if (vanha.isomorfinen(verkko)) return;
            }
            varasto.add(verkko.teeKopio());
            yhteensa++;
            if (verkko.yhtenainen()) yhtenaiset++;
            if (verkko.euler()) eulerit++;
            if (verkko.hamilton()) hamiltonit++;
        } else if (alku == loppu) {
            laskeVerkot(verkko, 1, loppu+1, raja);
        } else {
            laskeVerkot(verkko, alku+1, loppu, raja);
            verkko.lisaaKaari(alku, loppu);
            laskeVerkot(verkko, alku+1, loppu, raja);
            verkko.poistaKaari(alku, loppu);
        }
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Montako solmua? ");
        int n = input.nextInt();
        Verkko verkko = new Verkko();
        for (int i = 1; i <= n; i++) verkko.lisaaSolmu(i);
        laskeVerkot(verkko, 1, 1, n);
        System.out.println("Yhteensä: " + yhteensa);
        System.out.println("Yhtenäiset: " + yhtenaiset);
        System.out.println("Eulerit: " + eulerit);
        System.out.println("Hamiltonit: " + hamiltonit);
    }
}
