學習筆記 星空穿越 尤拉迴路 學習筆記

2021-09-02 12:50:45 字數 1790 閱讀 2342

題目大意:給你一張無向圖,每條邊有乙個經過次數的奇偶性,找到盡量少的路徑(可以不簡單)滿足這個條件。

題解:對與要求經過偶數次的邊拆成兩條邊。

然後度數為奇數的點任意配對,跑尤拉迴路演算法。

尤拉迴路演算法有個很簡單的演算法:任意dfs,出棧的時候將入邊放到答案序列的前端。

特判乙個連通塊全是要求經過偶數次的邊即可。

#include

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define rep(i,v) rep(i,0,(int)v.size()-1)

#define lint long long

#define ull unsigned lint

#define db long double

#define pb push_back

#define mp make_pair

#define fir first

#define sec second

#define debug(x) cerr<<#x<<"="<#define sp <<" "

#define ln typedef pair<

int,

int> pii;

typedef set<

int>

::iterator sit;

namespace input_space

inline

intinn()

}using input_space:

:inn;

namespace output_space

inline

intprint

(int x)

inline

intflush()

}using output_space:

:print;using output_space:

:pc;using output_space:

:flush;

const

int n=

200002

,m=500002

;struct edgese[m<<1]

;int h[n]

,etop,vis[n]

,d[n]

,del[m<<1]

,allz,top,s[m]

;inline

intadd_edge

(int u,

int v,

int w)

inline

intbuild_edge

(int u,

int v,

int w)

#define ot(i) ((((i)-1)^1)+1)

#define clr(a,n) memset(a,0,sizeof(int)*((n)+1))

intdfs

(int x)

return0;

}vector<

int> ans[m]

;int

main()

for(

int i=

1,las=

0;i<=n;i++)if

(d[i]

)rep

(i,1

,n)if

(!vis[i])if

(t}print

(cnt),pc

('\n');

rep(i,

1,cnt)

}return

flush()

,0;}

學習筆記 尤拉迴路

有兩個概念 尤拉路徑 在乙個圖中,由i點出發,將每個邊遍歷一次最終到達j點的一條路徑。尤拉迴路 i j時的尤拉路徑。我們需要確定乙個圖是否存在尤拉路徑,並找到這條路徑 那就很好做了qwq 可以用並查集判斷圖的聯通性 然後對於有向圖與無向圖,使用上述性質進行判斷 對於無向圖的尤拉迴路,任意一點都可以作...

尤拉迴路學習筆記

尤拉道路 概念 從無向圖中的乙個結點出發走出一條道路,每條邊恰好經過一次。這樣的路線稱為尤拉道路,也可形象的稱為 一筆畫 性質 除了起點和終點以外,其他點的 進出 次數應該相等。換句話說,除了起點和終點以外,其他點的度數應該是偶數 這也就引出了尤拉道路的充分條件 如果乙個無向圖是連通的,且最多只有兩...

尤拉迴路學習筆記

這裡先說一下尤拉圖和尤拉迴路的概念 如果圖g中的乙個路徑包括每個邊恰好一次,則該路徑稱為尤拉路徑 euler path 如果乙個迴路是尤拉路徑,則稱為尤拉迴路 euler circuit 具有尤拉迴路的圖稱為尤拉圖 簡稱e圖 具有尤拉路徑但不具有尤拉迴路的圖稱為半尤拉圖。這就清楚好多了,然後下面是尤...