日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF858F Wizard's Tour 解题报告

發布時間:2025/3/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF858F Wizard's Tour 解题报告 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

給定一張 \(n\) 個點 \(m\) 條邊的無向圖,每條邊連接兩個頂點,保證無重邊自環,不保證連通。
你想在這張圖上進行若干次旅游,每次旅游可以任選一個點 \(x\) 作為起點,再走到一個與 \(x\) 直接有邊相連的點 \(y\),再走到一個與 \(y\) 直接有邊相連的點 \(z\) 并結束本次旅游。
作為一個旅游愛好者,你不希望經過任意一條邊超過一次,注意一條邊不能即正向走一次又反向走一次,注意點可以經過多次,在滿足此條件下,你希望進行盡可能多次的旅游,請計算出最多能進行的旅游次數并輸出任意一種方案。

輸入輸出格式

輸入格式

\(1\) 行兩個正整數 \(n\)\(m\),表示全圖的點數與邊數
下接 \(m\) 行,每行兩個數字 \(u\)\(v\) 表示一條邊

輸出格式

\(1\) 行一個整數 \(cnt\) 表示答案
下接 \(cnt\) 行,每行三個數字 \(x, y\)\(z\),表示一次旅游的路線
如有多種旅行方案,任意輸出一種即可

說明

對于前 \(20\%\) 的數據, \(n \le10, m \le 20\).
對于另 \(20\%\) 的數據, \(m = n - 1\),并且圖連通
對于另 \(10\%\) 的數據,每個點的度數不超過 \(2\)
對于 \(100\%\) 的數據, \(n \le 100000, m \le 200000\)


可能還是沒怎么做過構造題目吧,我打的樹的特殊數據分其實改一改就是正解了。

通過手玩我們發現對一個有\(m\)條邊的連通塊來說,方案數量一定可以構造到\(\lfloor\frac{m}{2}\rfloor\)個。

構造方法如下

對某個連通塊隨便選擇一個點構造一顆搜索樹,在回溯的時候配對可以連接的邊,如果不能兩兩配對,那么用上自己頭上的邊。

考慮為什么這樣是對的,思路很簡單。我們發現除了選定根的某個兒子邊,所有的邊都可以用上,不會產生浪費。


Code:

#include <cstdio> #include <vector> #define rep(i,a,b) for(int i=a;i<=b;i++) #define Rep(i,a,b) for(int i=a;i<b;i++) #define ed() for(int i=head[now];i;i=Next[i]) #define pb(a) push_back(a) const int N=2e5+10; int head[N],to[N<<1],Next[N<<1],cnt=1; void add(int u,int v) {to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt; } int used[N<<1],ans[N<<2],n,m,tot,vis[N]; void dfs(int now,int fa,int edg) {vis[now]=1;std::vector <int> ch;ed(){int v=to[i];if(v!=fa&&!vis[v]) dfs(v,now,i);}ed(){int v=to[i];if(v!=fa&&!used[i]){ch.pb(i);used[i^1]=1;}}Rep(i,0,ch.size()){if(i&1) ans[++tot]=now;ans[++tot]=to[ch[i]];}if(ch.size()&1){if(fa) ans[++tot]=now,ans[++tot]=fa,used[edg]=1;else tot--;} } int main() {scanf("%d%d",&n,&m);int u,v;rep(i,1,m) scanf("%d%d",&u,&v),add(u,v),add(v,u);rep(i,1,n) if(!vis[i]) dfs(i,0,0);printf("%d\n",tot/3);rep(i,1,tot){printf("%d ",ans[i]);if(i%3==0) printf("\n");}return 0; }

2018.10.25

轉載于:https://www.cnblogs.com/butterflydew/p/9850674.html

總結

以上是生活随笔為你收集整理的CF858F Wizard's Tour 解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。