1 //本题题意:首先每个点之间都可达,然后m列举出不可达的,求出最多的生成树方案;
2 //k这个变量是没用的。
3 //公式:ans矩阵=度矩阵-建边矩阵;
4 //度矩阵是当i==j时的,建边矩阵于平时定义可达矩阵相同
5 #include<stdio.h>
6 #include<string.h>
7 #include<math.h>
8 #include<algorithm>
9 using namespace std;
10 #define INF 0x3f3f3f3f
11 #define LL long long int
12 const int MAXN=55;
13 LL A[MAXN][MAXN];
14 LL B[MAXN][MAXN];
15 LL determinant(int n)
16 {
17 LL res=1;
18 for(int i=1;i<=n;i++){
19 if(!B[i][i]){
20 bool flag=false;
21 for(int j=i+1;j<=n;j++){
22 if(B[j][i]){
23 flag=true;
24 for(int k=i;k<n;k++){
25 swap(B[i][k],B[j][k]);
26 }
27 res=-res;
28 break;
29 }
30 }
31 if(!flag)
32 return 0;
33 }
34 for(int j=i+1;j<=n;j++){
35 while(B[j][i]){
36 LL t=B[i][i]/B[j][i];
37 for(int k=i;k<=n;k++){
38 B[i][k]=B[i][k]-t*B[j][k];
39 swap(B[i][k],B[j][k]);
40 }
41 res=-res;
42 }
43 }
44 res*=B[i][i];
45 }
46 return res;
47 }
48 int main()
49 {
50 int n,m,k;
51 while(~scanf("%d%d%d",&n,&m,&k))//这个k没卵用,完全可以无视
52 {
53 memset(A,0,sizeof(A));
54 memset(B,0,sizeof(B));
55 for(int i=1;i<=m;i++){
56 int a,b;
57 scanf("%d%d",&a,&b);
58 A[a][b]=A[b][a]=1;
59 }
60 for(int i=1;i<=n;i++){
61 for(int j=1;j<=n;j++){
62 if(i!=j&&!A[i][j]){
63 B[i][i]++;
64 B[i][j]=-1;//减去邻接矩阵
65 }
66 }
67 }
68 n=n-1;
69 LL ans=determinant(n);
70 printf("%lld\n",ans);
71 }
72 return 0;
73 }