CF858F Wizard's Tour 解题报告
題目描述
給定一張 \(n\) 個點 \(m\) 條邊的無向圖,每條邊連接兩個頂點,保證無重邊自環(huán),不保證連通。
你想在這張圖上進(jìn)行若干次旅游,每次旅游可以任選一個點 \(x\) 作為起點,再走到一個與 \(x\) 直接有邊相連的點 \(y\),再走到一個與 \(y\) 直接有邊相連的點 \(z\) 并結(jié)束本次旅游。
作為一個旅游愛好者,你不希望經(jīng)過任意一條邊超過一次,注意一條邊不能即正向走一次又反向走一次,注意點可以經(jīng)過多次,在滿足此條件下,你希望進(jìn)行盡可能多次的旅游,請計算出最多能進(jìn)行的旅游次數(shù)并輸出任意一種方案。
輸入輸出格式
輸入格式
第 \(1\) 行兩個正整數(shù) \(n\) 與 \(m\),表示全圖的點數(shù)與邊數(shù)
下接 \(m\) 行,每行兩個數(shù)字 \(u\) 與 \(v\) 表示一條邊
輸出格式
第 \(1\) 行一個整數(shù) \(cnt\) 表示答案
下接 \(cnt\) 行,每行三個數(shù)字 \(x, y\) 與 \(z\),表示一次旅游的路線
如有多種旅行方案,任意輸出一種即可
說明
對于前 \(20\%\) 的數(shù)據(jù), \(n \le10, m \le 20\).
對于另 \(20\%\) 的數(shù)據(jù), \(m = n - 1\),并且圖連通
對于另 \(10\%\) 的數(shù)據(jù),每個點的度數(shù)不超過 \(2\)
對于 \(100\%\) 的數(shù)據(jù), \(n \le 100000, m \le 200000\)
可能還是沒怎么做過構(gòu)造題目吧,我打的樹的特殊數(shù)據(jù)分其實改一改就是正解了。
通過手玩我們發(fā)現(xiàn)對一個有\(m\)條邊的連通塊來說,方案數(shù)量一定可以構(gòu)造到\(\lfloor\frac{m}{2}\rfloor\)個。
構(gòu)造方法如下
對某個連通塊隨便選擇一個點構(gòu)造一顆搜索樹,在回溯的時候配對可以連接的邊,如果不能兩兩配對,那么用上自己頭上的邊。
考慮為什么這樣是對的,思路很簡單。我們發(fā)現(xiàn)除了選定根的某個兒子邊,所有的邊都可以用上,不會產(chǎn)生浪費。
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
轉(zhuǎn)載于:https://www.cnblogs.com/butterflydew/p/9850674.html
總結(jié)
以上是生活随笔為你收集整理的CF858F Wizard's Tour 解题报告的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python小白学习之函数装饰器
- 下一篇: c++入门之浅入浅出类——分享给很多想形