先记个模板,以后再写。
题目链接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#include <algorithm> #include <iostream> #include <cstring> #include <climits> #include <cstdlib> #include <cstdio> #include <vector> #include <cmath> #include <ctime> #include <queue> #include <stack> #include <map> #include <set> #define fi first #define se second #define U unsigned #define P std::pair #define Re register #define LL long long #define pb push_back #define MP std::make_pair #define all(x) x.begin(),x.end() #define CLR(i,a) memset(i,a,sizeof(i)) #define FOR(i,a,b) for(Re int i = a;i <= b;++i) #define ROF(i,a,b) for(Re int i = a;i >= b;--i) #define DEBUG(x) std::cerr << #x << '=' << x << std::endl const int MAXN = 2000+5; int n,m; LL a[MAXN][MAXN]; LL det(){ LL ret = 1; FOR(i,1,n-1){ FOR(j,i+1,n-1){ while(a[j][i]){ LL t = a[i][i]/a[j][i]; FOR(k,i,n-1) a[i][k] -= a[j][k]*t; FOR(k,i,n-1) std::swap(a[i][k],a[j][k]); ret *= -1; } } ret *= a[i][i]; } return ret; } inline void Solve(){ CLR(a,0); scanf("%d%d",&n,&m); FOR(i,1,m){ int u,v;scanf("%d%d",&u,&v);--u;--v; a[u][v] = a[v][u] = -1; a[u][u]++;a[v][v]++; } printf("%lld\n",det()); } int main(){ int T;scanf("%d",&T); while(T--) Solve(); return 0; } |
发表评论