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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JZOJ 5404. 【NOIP2017提高A组模拟10.10】Graph

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

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