簡要題意:求解小於等於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...