HDU6311 Cover 尤拉路徑 迴路

2022-08-18 18:24:11 字數 1461 閱讀 6933

hdu6311 cover

給出\(n\)個點的簡單無向圖,不一定聯通,現在要用最少的路徑去覆蓋所有邊,並且每條邊只被覆蓋一次,問最少路徑覆蓋數和各條路徑

\(n\le 10^5\)

對於每個連通塊分別處理

考慮每個聯通塊,必然是用最少的尤拉路徑去覆蓋,首先考慮連通塊裡沒有奇數度數的點的情況,這個情況下只要跑尤拉迴路即可

如果連通塊中有\(x\)個奇數度數的點,那麼顯然\(2|x\),且必然是用\(\frac\)條尤拉路徑去覆蓋,每兩個奇數度數的頂點之間會有一條尤拉路徑,考慮如何構造路徑,首先將奇數度數的頂點兩兩配對連邊,只剩下一對奇數度數點不連邊,然後在新建的圖中跑尤拉路徑(此時必然存在尤拉路徑),可以發現其中\(\frac-1\)條新加入的邊正好把路徑分成了\(\frac\)條,這些分開來的路徑正好是所求路徑

view code

//#pragma gcc optimize("o3")

//#pragma comment(linker, "/stack:1024000000,1024000000")

#includeusing namespace std;

function____ = ();

const int maxn = 1e5+7;

int n, m, deg[maxn], bel[maxn], vis[maxn<<2], num[maxn];

vectorpt[maxn];

struct graph

void addedge(int u, int v, int idd)

}g;void mark(int u, int id)

}stackstk;

void euler(int u)

}void print()

}void rua(int id)

else}}

for(int &x : pt[id]) if(deg[x]&1) last = x;

euler(last);

vectorvec;

while(true)

if(!stk.empty()) stk.pop();

printf("%d",vec.size());

for(int x : vec) printf(" %d",x);

puts("");

if(stk.empty()) break;}}

}void solve()

int id = 0;

memset(bel+1,0,n<<2);

int __count = 0;

for(int i = 1; i <= n; i++) if(!bel[i])

}printf("%d\n",__count);

for(int i = 1; i <= id; i++)

}int main()

HDU 6311 尤拉路 最小邊覆蓋

原題 題意 對於乙個圖 不一定聯通 最少需要多少筆 路徑 能覆蓋所有的邊,還有輸出路徑。尤拉路,對於乙個聯通的圖,需要max 1,度數為奇數的點 2 筆就能畫完。這題,對於每個聯通塊,把度數為奇數的點,按 對 加邊,只留兩個點做起點和終點,應該是這樣理解 加的邊就是 虛 邊。補完圖後,跑乙個dfs,...

尤拉迴路,尤拉路

參考以上 判斷尤拉路,尤拉迴路 注意圖聯通,可以dfs 或者並查集 一 無向圖 尤拉迴路 每個頂點度數都是偶數 尤拉路 所有點度數為偶數,或者只有2 個點度數為奇數 二 有向圖 非混合 尤拉迴路 每個頂點入度等於出度 尤拉路 每個頂點入度等於出度 或者只有1 個點入度比出度小 1,從這點出發,只有 ...

尤拉路 尤拉迴路

1 尤拉路 在乙個連通圖中存在一條路,經過途中所有邊一次且僅一次,這條路叫做尤拉路。2 尤拉迴路 在乙個連通圖中存在一條路,經過途中所有邊一次且僅一次,出發點亦是終點,這樣的路是尤拉迴路。1 無向圖有一條尤拉路 圖是連通的,且全部的結點的度是偶數 就是尤拉迴路的情況 或只有兩個結點的度是奇數。2 無...