<address id="bjbhz"><dfn id="bjbhz"><output id="bjbhz"></output></dfn></address><address id="bjbhz"><dfn id="bjbhz"></dfn></address>
        <address id="bjbhz"><dfn id="bjbhz"></dfn></address>

        <sub id="bjbhz"><var id="bjbhz"><mark id="bjbhz"></mark></var></sub>
          <sub id="bjbhz"><var id="bjbhz"></var></sub>
          <sub id="bjbhz"><var id="bjbhz"><ins id="bjbhz"></ins></var></sub>

          <address id="bjbhz"><var id="bjbhz"></var></address>
          <address id="bjbhz"><dfn id="bjbhz"></dfn></address>

          <address id="bjbhz"><listing id="bjbhz"><ins id="bjbhz"></ins></listing></address>

            <thead id="bjbhz"></thead>

          基环树略解

          基环树

          基环树,也叫 环套树,是一种图的类型。如果连通图 \(G=\{V,E\}\)\(|V|=|E|\),则我们称它是基环树。

          顾名思义,基环树就好似是在一棵树上加一条边得到的图。基环树有且仅有一个环,所以也被成为环套树。
          在这里插入图片描述
          如上图所示的图就是一棵基环树。

          用途

          基环树没什么用。

          它只能解决部分特殊问题,而这类问题通常会注明“边数=点数”,解法也比较单一,常被与其他算法一同考察。

          我们来看几道例题。


          luogu P1453 城市环路)今有基环树 \(G=\{V,E\}\),定义\[ans=\sum_{i=1}^{N}{a_i·b_i}\]\(\forall i\in[1,N]∩\N^*\)\(b_i\in\{0,1\}\),且 \(\forall e=(u,v)\in E\)\(b_u\text{ and }b_v=0\)\(\text{and}\) 表示按位与运算)。求 \(ans_{\max}\)

          Solution 本题中如果 \(N=M+1\),这显然就是“没有上司的舞会”了。

          考虑将新问题转化成已解决的问题。我们发现,环上有且仅有一条边对计算不产生影响,删除它即可。由一条边上的两个点不能被同时选中,不难想到给每个点设置两个状态:选中(1)与不选中(0);并查集找环,删除一条边后做树形动态规划即可解决此题。时间复杂度 \(O(N\alpha(N))\)

          参考代码

          #include<cstdio>
          #include<cstdlib>
          #include<cstring>
          
          const int MAXN=100010;
          
          int fa[MAXN];
          int a[MAXN];
          int sx,sy,fx,fy;
          int ST,ED;
          int n;
          
          struct node{
              int x,y,next;
          }e[MAXN+MAXN];
          int len=0;
          int first[MAXN];
          int ans;
          int f[MAXN][3];
          
          
          int findfa(int x){
              if(x==fa[x]) return x;
              return fa[x]=findfa(fa[x]);
          }
          void ins(int x,int y){
              e[++len].x=x;e[len].y=y;
              e[len].next=first[x];first[x]=len;
          }
          int max(int x,int y){
              return x>y?x:y;
          }
          void dfs(int x,int last){
              f[x][1]=a[x];f[x][0]=0;
              for(int i=first[x];i;i=e[i].next){
                  int y=e[i].y;
                  if(y==last) continue;
                  dfs(y,x);
                  f[x][0]+=max(f[y][1],f[y][0]);
                  f[x][1]+=f[y][0];
              }
          }
          inline int read(){
              int x=0; char c;
              do c=getchar(); while(c<'0'||c>'9');
              while(c>='0'&&c<='9')
                  x=x*10+c-48,c=getchar();
              return x;
          }
          int main(){
              n=read();
              for(int i=1;i<=n;++i){
                  a[i]=read();
                  fa[i]=i;
              }
              memset(first,0,sizeof(first));
              for(int i=1;i<=n;++i){
                  sx=read()+1;sy=read()+1;
                  fx=findfa(sx);fy=findfa(sy);
                  if(fx==fy){
                      ST=sx;ED=sy;
                      continue;
                  }
                  ins(sx,sy);ins(sy,sx);
                  fa[fx]=fy;
              }
              memset(f,0,sizeof(f));
              dfs(ST,0);ans=f[ST][0];
              dfs(ED,0);ans=max(ans,f[ED][0]);
              double k;
              scanf("%lf",&k);
              printf("%.1lf",ans*k);
          }

          接下来的这道习题与例题的思路不太一样。

          练习 1[NOIp2018] luogu P5022 旅行)有一棵基环树 \(T\),你初始在一个点上。每次可以从下列选项中选择一项执行:

          1. 沿着一条边走到一个没有访问过的点;
          2. 沿着一条边返回一个访问过的点。

          你需要依此法访问所有的 \(N\) 个点。每个点被首次访问的顺序形成了一个序列,求这个序列字典序最小的那个。

          基环树的建图同样重要。
          练习 2luogu P2607 [ZJOI2008]骑士)有 \(N\) 个人,每个人有两个值:\(d_i\) 战斗力,\(t_i\) 讨厌的人的编号(\(t_i\neq i\))。从这 \(N\) 个人中选出若干个人,使他们讨厌的人没被选中,且他们的战斗力之和最大。

          总结

          基环树的初步内容较少,解法单一,经常与其他算法一同出现。

          解决基环树上问题的关键点就是:处理额外边,将原问题转化成树上问题。

          本文列举了两种处理额外边的方法,难免有所疏漏敬请指正。此外,如果读者有好题推荐可以在评论区留言,我会尽量回复。感谢阅读。

          相关文章
          相关标签/搜索
          管家婆香港2018年资料四肖期期准铁算盘4887开奖结果四肖三期内必出刘伯温6374cm刘伯温168最快开奖现场开马开奖结果天天彩票 湛江市| 台中县| 汕头市| 红桥区| 碌曲县| 双城市| 同心县| 天峨县| 两当县| 温宿县| 阿坝| 友谊县| 晋城| 延寿县| 锦屏县| 关岭| 万盛区| 永城市| 万荣县| 改则县| 东光县| 固阳县| 兴隆县| 黄平县| 探索| 昌乐县| 邢台市| 河间市| 辉县市| 岳池县| 安陆市| 乌苏市| 莱州市| 游戏| 顺昌县| 河池市| 长武县| 海淀区| 天镇县| 新巴尔虎左旗| 开远市| 鄄城县| 定州市| 获嘉县| 华亭县| 邯郸县| 尚志市| 海门市| 肇州县| 岳西县| 山阴县| 玛沁县| 筠连县| 广昌县| 西昌市| 四平市| 来宾市| 玉溪市| 安远县| 安化县| 资源县| 金塔县| 民权县| 河津市| 克什克腾旗| 克东县| 常山县| 阳城县| 奉新县| 天津市| 临武县| 孙吴县| 南召县| 南华县| 吕梁市| 神池县| 高淳县| 同德县| 新龙县| 东平县| 溧阳市| 忻城县| 桂东县| 朝阳县| 泽库县| 青田县| 新乐市| 平定县| 鸡西市| 茂名市| 临桂县| 石景山区| 芷江| 阿合奇县| 时尚| 衡山县| 朔州市| 兴业县| 青河县| 射阳县| 衡南县| 西青区| 吉木萨尔县| 措美县| 白朗县| 乐业县| 德江县| 长宁县| 上饶县| 阿拉善盟| 延津县| 疏附县| 太原市| 偃师市| 城固县| 息烽县| 合山市| 周口市| 和平区| 乃东县| 休宁县| 苍溪县| 兴隆县| 盐亭县| 鄂托克前旗| 兰州市| 房产| 商水县| 威海市| 广饶县| 宁德市| 库伦旗| 定结县| 江津市| 莲花县| 社旗县| 南通市| 久治县| 荣成市| 健康| 句容市| 徐州市| 陕西省| 日喀则市| 广饶县| 射阳县| 嘉峪关市| 曲阜市| 东源县| 麦盖提县| 三明市| 利川市| 安溪县| 谢通门县| 远安县| 赣州市| 莒南县| 卓资县| 高台县| 乐陵市| 洪洞县| 水富县| 沙洋县| 高尔夫| 曲松县| 马鞍山市| 武宁县| 南华县| 贵溪市| 晋江市| 黑河市| 武义县| 姜堰市| 彩票| 东乌珠穆沁旗| 定西市| 新乡市| 航空| 鄯善县| 商河县| 台东县| 栖霞市| 仲巴县| 拉萨市| 三穗县| 易门县| 松潘县| 兴义市| 昂仁县| 永胜县| 无棣县| 额济纳旗| 商丘市| 乌兰浩特市| 遂宁市| 涿鹿县| 商水县| 墨玉县| 大余县| 扶绥县| 揭阳市| 松滋市| 淅川县| 万宁市| 旺苍县| 安福县| 邯郸县| 民乐县| 泉州市| 青川县| 太保市| 巴彦淖尔市| 白河县| 墨江| 林口县| 友谊县| 呼和浩特市| 金坛市| 将乐县| 内丘县| 黑水县| 溧水县| 美姑县| 梨树县| 郸城县| 乌海市| 闽侯县| 河源市| 安岳县| 大渡口区| 公安县| 峡江县| 潞城市| 寿宁县| 涞源县| 黄梅县| 石林| 辽源市| 姚安县| 灵石县| 姚安县| 台北市| 高雄县| 曲松县| 民丰县| 新平| 文水县| 道真| 兴国县| 葫芦岛市| 禄劝| 呼玛县| 瓮安县| 耒阳市| 隆尧县| 广德县| 拉孜县| 和田市| 平罗县| 定日县| 临泽县| 临泽县| 嘉鱼县| 沈阳市| 华阴市| 梓潼县| 新泰市| 竹北市| 阳信县| 民丰县| 龙岩市| 中宁县| 磐石市| 滁州市| 涟水县| 外汇| 洪泽县| 肇源县| 通渭县| 九寨沟县| 五台县| 宁津县| 夏河县| 苏尼特左旗| 遵义市| 基隆市| 大石桥市| 农安县| 陇西县| 镇坪县| 渝中区| 洛宁县| 卓资县| 刚察县| 舞阳县| 麻阳| 岢岚县| 松潘县| 康平县| 上蔡县| 宜川县| 石景山区| 元氏县| 仪征市| 南乐县| 东安县| 永修县| 洪洞县| 繁峙县| 沁水县| 蓬安县| 深州市| 寻乌县| 嘉峪关市| 信丰县| 砚山县| 松江区| 西平县| 东莞市| 临沂市| 平舆县| 苏尼特左旗| 凤阳县| 池州市| 绥化市| 工布江达县| 桑植县| 科尔| 廊坊市| 江山市| 秦安县| 辽宁省| 晋江市| 莒南县| 绩溪县| 建阳市| 东阳市| 易门县| 蓬莱市| 肇源县| 封开县| 新疆| 延川县| 东港市| 宜都市| 吴川市| 台东市| 屯留县| 东辽县| 无为县| 睢宁县| 天水市| 花垣县| 泰宁县| 康保县| 西华县| 科技| 彰武县| 琼海市| 莎车县| 黄浦区| 开平市| 华池县| 宁河县| 克拉玛依市| 盐山县| 敦煌市| 雷山县| 莒南县| 大同市| 四会市| 丰镇市| 济宁市| 常州市| 榕江县| 河东区| 吴川市| 朔州市| 微山县| 泗阳县| 章丘市| 牙克石市| 石阡县| 彭泽县| 彰化市| 通许县| 怀柔区| 平顶山市| 伊吾县| 南平市| 合川市| 永德县| 湘西| 万宁市| 伽师县| 刚察县| 延川县| 方城县| 泰顺县| 科尔| 宁晋县| 云浮市| 常熟市| 赫章县| 怀来县| 乌拉特中旗| 株洲市| 普格县| 中宁县| 镇原县| 子洲县| 赫章县| 蕉岭县| 萍乡市| 武邑县| 公安县| 军事| 东海县| 甘德县| 孟津县| 江达县| 舒兰市| 武夷山市| 来宾市| 龙陵县| 松桃| 申扎县| 镇雄县| 陆河县| 洪江市| 霸州市| 乡城县| 安徽省| 铁岭市| 廉江市| 阿巴嘎旗| 鲁山县| 堆龙德庆县| 宜兴市| 天柱县| 邢台市| 方山县| 河间市| 微博| 清丰县| 关岭| 五河县| 湾仔区| 黄冈市| 河北区| 万载县| 长寿区| 甘德县| 苏尼特右旗| 乡城县| 新竹县| 葫芦岛市| 苍山县| 三门峡市| 茂名市| 余姚市| 五台县| 张掖市| 新昌县| 河间市| 德昌县| 宁安市| 宜丰县| 佛冈县| 罗定市| 安岳县| 泾阳县| 彩票| 浪卡子县| 东乡| 大关县| 永兴县| 周口市| 平邑县| 南汇区| 大邑县| 固阳县| 龙岩市| 房产| 乌海市| 江西省| 诸城市| 灌阳县| 资源县| 莲花县| 阜宁县| 太谷县| 息烽县| 呼玛县| 图片| 洞头县| 商南县| 泰来县| 阳春市| 景东| 出国| 大名县| 阿巴嘎旗| 南汇区| 汝州市| 澄迈县| 江安县| 余庆县| 盐源县| 玛多县| 枣庄市| 东乌珠穆沁旗| 柯坪县| 沂南县| 托克托县| 茌平县| 察隅县| 阳曲县| 颍上县| 临湘市| 韶山市| 习水县| 株洲市| 毕节市| 孝昌县| 额济纳旗| 澄江县| 张家港市| 昆明市| 延边| 舟山市| 黔江区| 志丹县| 宣武区| 临安市| 樟树市| 潜山县| 正镶白旗| 凉山| 会理县| 永福县| 缙云县| 威信县| 万安县| 南郑县| 绍兴市| 庄浪县| 昌黎县| 泰和县| 合江县| 永昌县| 承德县| 双鸭山市| 霍邱县| 大余县| 陈巴尔虎旗| 阳曲县| 蒲城县| 正安县| 竹溪县| 绥芬河市| 新乐市| 浦北县| 霍州市| 岳西县| 天峻县| 灵台县| 苗栗市| 仙居县| 武平县| 将乐县| 仁寿县| 儋州市| 昌乐县| 安丘市| 河南省| 宝清县| 双柏县| 朝阳市| 阳东县| 馆陶县| 苍南县| 广昌县| 陆丰市| 达孜县| 古交市| 牟定县| 仁化县| 新巴尔虎左旗| 大丰市| 沁源县| 聂荣县| 盱眙县| 香港| 大化| 阳城县| 本溪市| 苍山县| 洞口县| 甘泉县| 二手房| 松阳县| 淳安县| 海林市| 新平| 泰安市| 开原市| 元阳县| 兴国县| 清苑县| 玉门市| 全椒县| 山丹县| 长海县| 朝阳县| http://www.jx1870fullv.fun http://wap.jx1870killv.fun http://www.jx1870expandv.fun http://m.jx1870featurev.fun http://m.jx1870killv.fun http://m.jx1870flyv.fun http://www.jx1870fearv.fun http://m.jx1870fruitv.fun http://www.jx1870graduatev.fun http://m.hz0j4r5vo.fun http://jx1870inchv.fun http://jx1870fixv.fun http://jx1870fillv.fun http://m.jx1870foxv.fun http://m.jx1870fatv.fun http://wap.jx1870izplezentv.fun http://wap.jx1870hirev.fun http://jx1870footv.fun