原題:
題意:對於乙個圖(不一定聯通),最少需要多少筆(路徑)能覆蓋所有的邊,還有輸出路徑。
尤拉路,對於乙個聯通的圖,需要max(1,度數為奇數的點 / 2)筆就能畫完。
這題,對於每個聯通塊,把度數為奇數的點,按」對「加邊,(只留兩個點做起點和終點,應該是這樣理解),加的邊就是「虛」邊。
補完圖後,跑乙個dfs,把邊加到集合中,就是要找尤拉路的路徑。
統計時,碰到實邊,res++,同時把路徑不斷加到答案裡。直到碰到虛邊(應該可以理解成不能在這一筆中畫完了,所有要再開一筆)。
#include
using
namespace
std;
int n,m;
int e = 0;
struct edge;
edge edge[400005];
int head[100005];
int du[100005];
void addedge(int u,int v,int id)
bool vis[100005];
vector
ji;
void dfs1(int u)
}vector
ac;
void dfs2(int u)
}vector
ans[100005];
int res;
int main()
res = 0;
int u,v;
int id = 1;
for(int i = 1; i <= m; i++)
for(int i = 1; i <= n; i++)
// dfs2,同時存乙個補完的圖的尤拉路徑
ac.clear();
dfs2(st);
for(int j = ac.size() - 1; j >= 0; j--) }}
// 輸出
printf("%d\n",res);
for(int i = 1; i <= res; i++)
printf("\n");}}
return
0;}
HDU6311 Cover 尤拉路徑 迴路
hdu6311 cover 給出 n 個點的簡單無向圖,不一定聯通,現在要用最少的路徑去覆蓋所有邊,並且每條邊只被覆蓋一次,問最少路徑覆蓋數和各條路徑 n le 10 5 對於每個連通塊分別處理 考慮每個聯通塊,必然是用最少的尤拉路徑去覆蓋,首先考慮連通塊裡沒有奇數度數的點的情況,這個情況下只要跑尤...
HDU 3018 Ant Trip(尤拉路的條數)
題目位址 題意 告訴你乙個無向圖,問你要一筆畫多少次才能把所有邊都畫一遍,且每條邊僅畫一遍。思路 如果你還沒有理解或者不知道尤拉圖的概念的話,可以看我的另一篇部落格 傳送門,那裡詳細的講了有向圖無向圖的尤拉圖的概念。言歸正傳,這題其實也是一道裸的尤拉鏈路的題目,他其實一筆畫就是要找到邊能全部連起來,...
hdu 3018(尤拉路 並查集)
傳送門 題解 對於一般的無向連通圖,如果有x個點入度為奇數,覆蓋所有邊所需要的筆數是max x 2,1 嚴格證明戳這兒。可以理解為用x 2筆消掉多出來的邊,取1的時候圖是乙個尤拉圖。p.s.注意特判 include include include include using namespace st...