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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

基环树

發布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基环树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 概念
  • 找環
    • 拓撲排序
    • dfs
  • 問題解決方法:
    • 斷環法:
      • 題目:
    • 二次dp法
      • 題目:
    • 斷環復制法
      • 題目:

參考博客

概念

基環樹 = n個點n條邊的圖 = 1棵樹 + 1個環

無向樹(N點N邊無向圖)


外向樹(每個點入度=1)


內向樹(每個點出度=1)
以上三種樹有十分優秀的性質,就是可以直接將環作為根。就可以對每個環的子樹進行單獨處理,最后再處理環

找環

拓撲排序

處理無向圖
可以找出環上的所有點
入度大于等于2的點就是環上的點
code

void topsort(){int l=0,r=0;for (int i=1;i<=n;i++) if(in[i]==1) q[++r]=i;while(l<r) {int now=q[++l];for (int i=ls[now];i;i=a[i].next){int y=a[i].to;if(in[y]>1){in[y]--;if(in[y]==1) q[++r]=y;}}} }

dfs

處理有向圖,碼量小
mark就是環上的一個點

void check_c(int x) {v[x]=true;if(v[d[x]]) mark=x;else check_c(father[x]);return; }

問題解決方法:

斷環法:

每次斷開環上的一條邊跑一遍答案,然后去最大值
適合:數據較小,且環不會影響答案的題目

題目:

[NOIP2018 提高組] 旅行

二次dp法

對于環,我們可以像環形dp一樣將一條邊強行斷開處理,然后強行連上再處理一遍
適合:跑滿足正確性的

題目:

ZJOI2008騎士

斷環復制法

我們依舊像環形dp一樣斷開環,然后再復制一遍放在后面
適合:多個需要維護的

題目:

IOI2008 Island
AcWing 289. 環路運輸

總結

以上是生活随笔為你收集整理的基环树的全部內容,希望文章能夠幫你解決所遇到的問題。

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