【學習筆記】BEST定理

  • 懼怕忘記簡單寫一點:
  • 無向圖的生成樹計數:https://www.cnblogs.com/zj75211/p/8039443.html   (*ZJ學長 ORZ )
  • 有向圖的歐拉回路計數:https://blog.csdn.net/john123741/article/details/76586690
  • 連通圖$G = (V,E)$,歐拉回路條數$ec(G)$,$t_{s}$爲有向圖以$s$爲根的樹(內或外)個數,;
  • 令$N_{x}(K)$爲矩陣$K$去掉$x$階的主子式,省略$x$表任意一階,
  • 無向圖的生成樹:

  • 令$K = D - A$,D爲度數矩陣,$A$爲鄰接矩陣;
  • 無向圖生成樹個數$t = det(N(K))$
  • 有向圖的生成樹:

  • 份內向(邊由葉子指向根)和外向(由根指向葉子);
  • 外向樹:$K = D - A$,$D$爲入度矩陣,$A$爲鄰接矩陣;
  • $t_{s} = det(N_{s}(K))$;
  • 內向樹:$K = D - A$,$D$爲出度矩陣,$A$爲鄰接矩陣;
  • 一樣有$t_{s} = det(N_{s}(K))$;
  • 有向圖的歐拉回路:

  • 若是每一個點出度和入度不相等爲0;
  • $deg(u)$表示每一個點的度數=出度=入度,以s爲起點,$t_{s}$指外向樹;
  • $ec_{s}(G) \ =  \  t_{s}  \  \Pi_{u \in V} (\deg(u)-1)!$
  • 另外我發現其實這裏的$t_{s}$的$s$能夠換成任意點,也就是說有歐拉回路的圖全部點的外向樹個數都是同樣的不知道對不對??
  • 若是邊的環同構不算一種方案再乘上一個起點度數$deg(s)$;
  • 因此你們的式子會有些小差別就是由於這個;
  • 放一個裸題bzoj3659:
  •  1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=110,M=200010,mod=1000003;
     4 int n,m,fac[M],deg[N],a[N][N];
     5 int pw(int x,int y){
     6     int re=1;
     7     for(;y;y>>=1,x=1ll*x*x%mod){
     8         if(y&1)re=1ll*re*x%mod;
     9     }
    10     return re;
    11 }
    12 int gauss(){
    13     int fg=0,re=1;
    14     for(int i=1;i<n;++i){
    15         int pos=i;
    16         for(int j=i;j<n;++j)if(a[j][i]){
    17         pos=j;break;
    18         }
    19         if(pos!=i){
    20             fg^=1; 
    21             for(int j=i;j<n;++j)swap(a[i][j],a[pos][j]);
    22         }
    23         re=1ll*re*a[i][i]%mod;
    24         int tmp = pw(a[i][i],mod-2);
    25         for(int j=i;j<n;j++)a[i][j]=1ll*a[i][j]*tmp%mod;
    26         for(int j=i+1;j<n;++j)
    27         for(int k=n-1;k>=i;--k)a[j][k]=(a[j][k]-1ll*a[j][i]*a[i][k]%mod+mod)%mod;
    28     }
    29     if(fg)re=mod-re;
    30     return (re+mod)%mod;
    31 }
    32 int main(){
    33     freopen("bzoj3659.in","r",stdin);
    34     freopen("bzoj3659.out","w",stdout);
    35     for(int i=fac[0]=1;i<=2e5;++i)fac[i]=1ll*fac[i-1]*i%mod;
    36     while(~scanf("%d",&n)&&n){
    37         for(int i=1;i<=n;++i){
    38             for(int j=1;j<=n;++j)a[i][j]=0;
    39         }
    40         for(int i=1,s;i<=n;++i){
    41             scanf("%d",&s);
    42             deg[i]=s;
    43             for(int j=1,x;j<=s;++j){
    44                 scanf("%d",&x);
    45                 if(i!=x)a[i][x]--,a[i][i]++;
    46             }
    47         }
    48         if(n==1){printf("%d\n",fac[deg[1]]);continue;}
    49         int ans = gauss();
    50         for(int i=1;i<=n;++i)ans=1ll*ans*fac[deg[i]-1]%mod;
    51         ans = 1ll * deg[1] * ans %mod;
    52         printf("%d\n",ans);
    53     }
    54     return 0;
    55 }
    bzoj3659
  • 未完待續。。。。。。。。。。。。。。。。。。
相關文章
相關標籤/搜索