校內模擬 尤拉迴路(Burnside)(容斥)

2021-09-28 11:02:56 字數 2122 閱讀 7974

簡要題意:求解小於等於n

nn個點,有尤拉迴路,允許有自環的無向圖的個數,點標號重排後同構的圖算同一種。

尤拉圖判定就兩個條件,連通,所有點度數為偶數。

自環先不管,反正對點度和尤拉迴路都沒有影響。

連通先不管,算出所有情況後用不連通容斥算連通,這個應該是乙個比較顯然的思路。

考慮算所有點度數都為偶數的圖在允許標號重排下有多少種,就是這道題:here

然後現在考慮容斥算連通的答案。

由於這個時候算的是標號重排意義下的方案數。我們強行列舉最大的連通塊siz是多少,且這個siz的連通塊有多少個,然後用插板法算一下方案數,得到強行不連通的情況。

所有情況減去不連通的情況即為連通情況。

注意題目要求不能算乙個點沒有自環的情況,最後要減掉。

**:

#include

#define ll long long

#define re register

#define cs const

using std::cerr;

using std::cout;

int mod=

998244353

;inline

intadd

(int a,

int b)

inline

intdec

(int a,

int b)

inline

intmul

(int a,

int b)

inline

intpower

(int a,

int b,

int res=1)

inline

void

inc(

int&a,

int b)

inline

void

dec(

int&a,

int b)

inline

void

mul(

int&a,

int b)

cs int n=55;

int ans;

int fac[n]

,ifac[n]

,inv[n]

,g[n]

[n];

int fa[n]

,d[n]

,ct[n]

,lp[n]

,now;

inline

intgf

(int u)

inline

intcalc()

for(

int re i=

1;i<=now;

++i)

for(

int re j=i+

1;j<=now;

++j)

}for

(int re i=

1;i<=now;

++i)

if(fa[i]

==i)res+=1

+(d[i]

?d[i]-1

:0);

else d[

gf(i)]+

=d[i]

;return

power(2

,res);}

void

dfs(

int las,

int rest,

int coef)

for(

int re i=std::

min(las,rest)

;i;--i)

}inline

intc

(int n,

int m)

int n;

namespace dp

}int ans=0;

for(

int re i=

1;i<=n;

++i)

inc(ans,g[i]);

cout<<

dec(ans,1)

<<

"\n";}

}using dp::f;

signed

main()

dp::

solve()

;return0;

}

尤拉迴路 輸出尤拉迴路的路徑

有向or無向均可,重邊 step1 從u開始,找到與他相連的v,放入棧,刪除 u,v 這條邊,然後從v開始 step2 當有一點沒有與他相連的點時,放入path,然後從stack取棧頂繼續開始找點刪邊。最後記得把棧裡的點放到path中。path倒序輸出 需要先找到起點 鄰接表法,適合稀疏圖 incl...

尤拉迴路 UOJ117 尤拉迴路 題解

判斷無向圖和有向圖是不是尤拉迴路。如果是,求出任意一條尤拉迴路。判斷尤拉迴路 證明?我不會啊!怎麼求尤拉迴路呢?因為已經確定了是尤拉迴路,所以我們可以直接dfs瞎搞。隨便從乙個點開始dfs,一條邊走過後就刪除。回溯時將其入隊。最後的佇列反過來就是答案。原理 最後的佇列是返回路徑,所以反過來就是答案。...

HDU 1878 尤拉迴路(判斷尤拉迴路)

題目大意 尤拉迴路是指不令筆離開紙面,可畫過圖中每條邊僅一次,且可以回到起點的一條迴路。現給定乙個圖,問是否存在尤拉迴路?解題思路 判斷無向圖是否存在尤拉迴路,判斷每個點的度數是否為偶數 並查集確認連通性。1 include2 include3 include4 define clr arr,val...