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 無...