JZOJ 5404. 【NOIP2017提高A组模拟10.10】Graph
Description
給定一張n個點m條邊的無向圖,每條邊連接兩個頂點,保證無重邊自環,不保證連通
你想在這張圖上進行若干次旅游,每次旅游可以任選一個點x作為起點,再走到一個與x 直接有邊相連的點y,再走到一個與y 直接有邊相連的點z 并結束本次旅游
作為一個旅游愛好者,你不希望經過任意一條邊超過一次,注意一條邊不能即正向走一次又反向走一次,注意點可以經過多次,在滿足此條件下,你希望進行盡可能多次的旅游,請計算出最多能進行的旅游次數并輸出任意一種方案
Input
第1 行兩個正整數n 與m,表示全圖的點數與邊數
下接m 行,每行兩個數字u 與v 表示一條邊
Output
第1 行一個整數cnt 表示答案
下接cnt 行,每行三個數字x, y 與z,表示一次旅游的路線
如有多種旅行方案,任意輸出一種即可
Sample Input
4 5
1 2
3 2
2 4
3 4
4 1
Sample Output
1
2
Data Constraint
對于前20% 的數據,n <= 10;m <= 20.
對于令20% 的數據,m = n - 1,并且圖連通
對于令10% 的數據,每個點的度數不超過2
對于100% 的數據,n <= 100000;m <= 200000
Solution
由于這個圖不一定是連通圖,且兩兩聯通塊之間互不影響,所以這里只討論一個聯通快。
對于一個邊數為 m 聯通快,顯然能有 ?m2? 條旅游路線,因為點能重復走。
-問題是如何連邊呢?
把連通塊看成一棵樹,遍歷一遍,記錄遍歷的順序。(注意只走尚未走過的點)
按照遍歷的順序的倒序操作,對于一個點,又開一個隊列。
先把連“兒子”節點的邊加入進去,有的話再將連“父親”節點的邊加入進去。
這樣兩條兩條進行組合,就能不重不漏地匹配,
因為先匹配深度大、再匹配深度小的,就能保證深度大的一定能被匹配,深度小的可以以后再說。
最后將每個連通塊中匹配的邊都一起輸出即可。
Code
#include<cstdio> using namespace std; const int N=100001; int tot,ans; int first[N],next[N<<2],en[N<<2]; int fa[N],q[N],num[N],vis[N<<2],ans1[N][3]; inline int read() {int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w; } inline void insert(int x,int y) {next[++tot]=first[x];first[x]=tot;en[tot]=y; } inline void bfs(int x) {int l=0,r=1;fa[q[1]=x]=-1;while(l<r)for(int i=first[q[++l]];i;i=next[i])if(!fa[en[i]]) fa[q[++r]=en[i]]=q[l];for(int i=r;i;i--){num[0]=0;for(int j=first[q[i]];j;j=next[j])if(!vis[j] && en[j]!=fa[q[i]]) num[++num[0]]=j;for(int j=first[q[i]];j;j=next[j])if(!vis[j] && en[j]==fa[q[i]]){num[++num[0]]=j;break;}for(int j=1;j<num[0];j+=2){vis[num[j]]=vis[num[j]^1]=vis[num[j+1]]=vis[num[j+1]^1]=true;ans1[++ans][0]=en[num[j]];ans1[ans][1]=q[i];ans1[ans][2]=en[num[j+1]];}} } int main() {int n=read(),m=read();for(int i=tot=1;i<=m;i++){int x=read(),y=read();insert(x,y);insert(y,x);}for(int i=1;i<=n;i++)if(!fa[i]) bfs(i);printf("%d\n",ans);for(int i=1;i<=ans;i++)printf("%d %d %d\n",ans1[i][0],ans1[i][1],ans1[i][2]);return 0; }總結
以上是生活随笔為你收集整理的JZOJ 5404. 【NOIP2017提高A组模拟10.10】Graph的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 5406. 【NOIP2017
- 下一篇: JZOJ 5405. 【NOIP2017