Typedef long ll; const int n = 105; // number of points const int M = 1005; // Number of edges // The vertex ID from 1 to n mod is long longstruct node {int set [N]; void Init (int n) {for (INT I = 0; I <= N; I ++) set [I] = I;} int find (INT X) {return x = set [x]? X: Set [x] = find (set [x]);} int Union (int x, int y) {int xx = find (X ); int YY = find (y); If (xx = YY) Return-1; set [XX] = YY; return 1 ;}} A, B, C; struct node {int U, V, DIS;} edge [m]; int edgenum; void add (int u, int V, int d) {node E = {u, v, d}; edge [++ edgenum] = E;} bool visit [N]; vector <int> G [N]; ll p [N] [N], DEG [N] [N]; int CMP (node A, Node B) {return. dis <B. DIS;} ll det (ll a [] [N], int N, ll mod) {int I, J, K; ll temp = 1, t; for (I = 0; I <n; I ++) for (j = 0; j <n; j ++) A [I] [J] % = MOD; for (I = 1; I <n; I ++) {for (j = I + 1; j <N; j ++) while (A [J] [I]) {T = A [I] [I]/A [J] [I]; for (k = I; k <n; k ++) {A [I] [k]-= A [J] [k] * t; A [I] [k] % = MOD ;} for (k = I; k <n; k ++) Swap (A [I] [K], a [J] [k]); temp =-temp ;} temp = temp * A [I] [I] % MOD;} return (temp + mod) % MOD;} ll cal_mst_count (INT N, ll mod) {sort (edge + 1, Edge + edgenum + 1, CMP); int pre = edge [1]. DIS; ll ans = 1;. init (n); B. init (n); memset (visit, 0, sizeof (visit); memset (deg, 0, sizeof (DEG); For (INT I = 0; I <= N; I ++) g [I]. clear (); For (int t = 1; t <= edgenum + 1; t ++) {If (edge [T]. dis! = Pre | T = edgenum + 1) {for (INT I = 1, K; I <= N; I ++) if (visit [I]) {k = B. find (I); G [K]. push_back (I); visit [I] = 0;} For (INT I = 1; I <= N; I ++) if (G [I]. size () {memset (p, 0, sizeof (p); For (Int J = 0; j <G [I]. size (); j ++) for (int K = J + 1, x, y; k <G [I]. size (); k ++) {x = G [I] [J]; y = G [I] [k]; P [J] [k] = P [k] [J] =-deg [x] [Y]; P [J] [J] + = deg [x] [Y]; P [k] [k] + = deg [x] [Y];} ans = ans * det (p, G [I]. size (), MoD) % MOD; For (Int J = 0; j <G [I]. size (); j ++). set [G [I] [J] = I;} memset (deg, 0, sizeof (DEG); For (INT I = 1; I <= N; I ++) {B. set [I] =. find (I); G [I]. clear () ;}if (t = edgenum + 1) break; Pre = edge [T]. DIS;} int x =. find (edge [T]. u); int y =. find (edge [T]. v); If (x = y) continue; visit [x] = visit [y] = 1; B. union (x, y); deg [x] [Y] ++; deg [y] [x] ++;} If (! Edgenum) return 0; For (INT I = 2; I <= N; I ++) if (B. Find (I )! = B. Find (1) return 0; return ans;} void Init () {edgenum = 0 ;}
Minimum Spanning Tree count Template