Counting labelled graphs (all, connected, acyclic directed, even), labelled trees and forests (Cayley, given degrees, rooted forests, functional graphs) and unlabelled trees (rooted and free, Otter). Spanning trees of a given graph are the Matrix-Tree Theorem; Prüfer codes and tree isomorphism are in Isomorphism and Prüfer; Comb/mint from Modular Arithmetic.

Objects on labelled verticesCountValues ()
graphs; tournaments1, 2, 8, 64, 1024, 32768
graphs with edges
connected graphs; EGF 1, 1, 4, 38, 728, 26704
graphs with all degrees even (Eulerian, not nec. connected)1, 1, 2, 8, 64, 1024
DAGs (Robinson)1, 3, 25, 543, 29281, 3781503
trees (Cayley)1, 1, 3, 16, 125, 1296
trees with degrees ()
forests of trees rooted at given vertices
all rooted forests1, 3, 16, 125, 1296, 16807
spanning trees of
functional graphs
connected functional graphs (one cycle)1, 3, 17, 142, 1569, 21576
Unlabelled ()MethodValues
rooted trees Euler transform: 1, 1, 2, 4, 9, 20, 48, 115, 286, 719, 1842
free trees Otter: 1, 1, 1, 2, 3, 6, 11, 23, 47, 106, 235
graphs up to isomorphismPólya over cycle types (Burnside and Pólya)1, 2, 4, 11, 34, 156, …
struct GraphCounting {                                     // tables for 0..n, prime modulus > n
    int n; Comb cb; vector<mint> graphs, connected, dags;
    GraphCounting(int N) : n(N), cb(N + 1), graphs(N + 1), connected(N + 1), dags(N + 1) {
        for (int i = 0; i <= n; i++) graphs[i] = mint(2).pow((ll)i * (i - 1) / 2);
        connected[0] = 0;
        for (int i = 1; i <= n; i++) {                     // fix vertex 1; its component has k vertices
            mint s = graphs[i];
            for (int k = 1; k < i; k++) s -= cb.C(i - 1, k - 1) * connected[k] * graphs[i - k];
            connected[i] = s;
        }
        dags[0] = 1;
        for (int i = 1; i <= n; i++) {                     // inclusion-exclusion over the set of sources
            mint s = 0;
            for (int k = 1; k <= i; k++) { mint t = cb.C(i, k) * mint(2).pow((ll)k * (i - k)) * dags[i - k]; s += k % 2 ? t : -t; }
            dags[i] = s;
        }
    }
    mint trees(int i) const { return i <= 1 ? mint(1) : mint(i).pow(i - 2); }
    mint rootedForests(int i, int k) const { if (k == i) return 1; if (k == 0) return i == 0; return mint(k) * mint(i).pow(i - k - 1); }
    mint allRootedForests(int i) const { return mint(i + 1).pow(max(i - 1, 0)); }
    mint evenGraphs(int i) const { return i == 0 ? mint(1) : mint(2).pow((ll)(i - 1) * (i - 2) / 2); }
    mint connectedFunctional(int i) const {
        mint s = 0;
        for (int k = 1; k <= i; k++) s += cb.f[i] * cb.fi[i - k] * (k == i ? mint(i).inv() : mint(i).pow(i - k - 1));
        return s;
    }
    mint treesWithDegrees(const vector<int>& d) const {    // labelled trees with deg(i) = d[i], n >= 2
        int m = sz(d); ll s = 0; for (int x : d) { if (x < 1) return 0; s += x; }
        if (s != 2LL * m - 2) return 0;
        mint r = cb.f[m - 2]; for (int x : d) r *= cb.fi[x - 1];
        return r;
    }
};
 
pair<vector<ll>, vector<ll>> unlabeledTrees(int N) {        // r[n] rooted, t[n] free, exact up to n ~ 38
    vector<ll> r(N + 1, 0), t(N + 1, 0), s(N + 1, 0);       // s[k] = sum_{d | k} d r[d]
    if (N >= 1) r[1] = 1;
    for (int m = 1; m < N; m++) {                          // r[m+1] = (1/m) sum_{k=1}^m s[k] r[m-k+1]
        for (int d = 1; d <= m; d++) if (m % d == 0) s[m] += d * r[d];
        ll acc = 0; for (int k = 1; k <= m; k++) acc += s[k] * r[m - k + 1];
        r[m + 1] = acc / m;
    }
    for (int m = 1; m <= N; m++) {
        ll sq = 0; for (int i = 1; i < m; i++) sq += r[i] * r[m - i];
        if (m % 2 == 0) sq -= r[m / 2];
        t[m] = r[m] - sq / 2;
    }
    if (N >= 0) t[0] = 1;
    return {r, t};
}

Complexity: GraphCounting (or with power-series for , Counting with Power Series); unlabeledTrees . Variants solved the same way: connected graphs with edges (DP over vertices and edges with the same “component of vertex 1” split), labelled bipartite and strongly connected digraphs (inclusion–exclusion over a distinguished part, with EGFs).