圖論—尤拉回路/路徑

sazhichi發表於2024-03-24

前置知識:尤拉圖 (兩個要點:1.是連通圖才有尤拉回路2.是否滿足出度和入度的要求)

模板題 :P7771 【模板】尤拉路徑 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

尤拉回路

1.• 對於無向圖,尤拉回路就是在圖的所有結點的度都是偶數,並且圖是連通的情況下,從任意一個節點開始 dfs 都可以回到原點。
一道典題:P6066 [USACO05JAN] Watchcow S - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)從一點出發回到這一點的尤拉回路
2.P2731 [USACO3.3] 騎馬修柵欄 Riding the Fences - 洛谷 | 電腦科學教育新生態 (luogu.com.cn) 尤拉回路需要考慮重邊是否計算

尤拉路徑

1.https://www.luogu.com.cn/problem/UVA10129 尤拉路徑的應用題,對於每個單詞都要出現一次相當於尤拉路徑中每條邊都有出現一次,要考慮如何保留邊的資訊
2.對於判連通圖來說,dfs有可能會爆棧,那麼可以改用並查集

尋找尤拉路徑

//對於稠密圖,刪邊操作還是很重要的,否則可能會T
void dfs(int u){
	for(int i = vis[u];i<G[u].size();i = vis[u]){
		vis[u] = i+1;//刪邊操作很重要,當邊特別大時
		dfs(G[u][i]);
	}
	st.push(u);
}

判斷是否能夠形成尤拉回路/路徑(省略判連通圖)

fa(i,1,n){
		if(d[i][0] != d[i][1]){
			tag = 0;
			if(d[i][0]-d[i][1]==1) mp[0]++,start = i;
			else if(d[i][1]-d[i][0]==1) mp[1]++;
			else {
				cout<<"No"<<endl;
				return 0;
			}
		}
	}
	if((!tag)&&!(mp[0] == mp[1]&&mp[1] == 1)) {
		cout<<"No"<<endl;
		return 0;
	}