題目大意:給你一張無向圖,每條邊有乙個經過次數的奇偶性,找到盡量少的路徑(可以不簡單)滿足這個條件。
題解:對與要求經過偶數次的邊拆成兩條邊。
然後度數為奇數的點任意配對,跑尤拉迴路演算法。
尤拉迴路演算法有個很簡單的演算法:任意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圖 具有尤拉路徑但不具有尤拉迴路的圖稱為半尤拉圖。這就清楚好多了,然後下面是尤...