题目链接:点击查看

题目大意:给出一棵 n 个点的基环树,现在需要求所有长度大于等于 1 的路径个数

题目分析:对于所有的路径 ( x , y ) 可以分成下列两种情况来考虑:

  1. 路径不会经过环上的边:此时点 x 和点 y 之间的路径是唯一的
  2. 路径会经过环上的边:此时点 x 和点 y 之间的路径有两条,一条是沿着环顺时针走,另一条是沿着环逆时针走

当然直接正向去考虑应该也是可以做出来的,但这个题比较优秀的一种思路是正难则反,首先假设所有的路径都会经过环上的边,然后再统计有多少个点对 ( x , y ) 之间的路径是无需经过环上的边,减去其贡献即可

具体实现是先跑出环,这个用拓扑或dfs都能跑,然后将整个环视为根节点,这样整张图就可以视为一棵树了,跑出以环为 “根” 节点的所有子树大小即可,因为对于每个子树来说都是相互独立的,每个子树中的点两两之间必定只有唯一的一条路径

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e6+100;vector<int>node[N];bool vis[N];int fa[N],dfn[N],id;void get_loop(int u)
{dfn[u]=++id;for(auto v:node[u]){if(dfn[v]){if(dfn[v]<dfn[u])continue;while(v!=fa[u]){vis[v]=true;v=fa[v];}return;}fa[v]=u;get_loop(v);}
}int dfs(int u)
{vis[u]=true;int ans=1;for(auto v:node[u]){if(vis[v])continue;ans+=dfs(v);}return ans;
}void init(int n)
{id=0;for(int i=1;i<=n;i++)node[i].clear();memset(dfn,0,sizeof(int)*(n+5));memset(vis,false,n+5);
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){int n;scanf("%d",&n);init(n);for(int i=1;i<=n;i++){int u,v;scanf("%d%d",&u,&v);node[u].push_back(v);node[v].push_back(u);}get_loop(1);LL ans=1LL*n*(n-1);for(int i=1;i<=n;i++)if(vis[i]){LL t=dfs(i);ans-=t*(t-1)/2;}printf("%lld\n",ans);}return 0;
}

CodeForces - 1454E Number of Simple Paths(基环树+思维)相关推荐

  1. Codeforces Round #686 (Div. 3) E. Number of Simple Paths 基环树 + 容斥

    传送门 文章目录 题意: 思路: 题意: 给你一颗基环树,求长度>=1>=1>=1的路径个数. 思路: 先考虑一棵树,他的答案显然是n∗(n−1)2\frac{n*(n-1)}{2} ...

  2. 1454E - Number of Simple Paths

    题目链接:https://codeforces.com/problemset/problem/1454/E 题目其实很容易,一开始有点逃避了- 很容易知道n个点,n条边的连通图必有环,如果我们不断的把 ...

  3. 数据结构之基环树——骑士,Island,旅行加强版,Number of Simple Paths,Traffic Network in Numazu,Card Game

    文章目录 [ZJOI2008]骑士 [IOI2008] Island [NOIP2018 提高组] 旅行 加强版 CF1454E Number of Simple Paths Traffic Netw ...

  4. CodeForces - 1252L Road Construction(基环树+有源汇有上下界的最大流)

    题目链接:点击查看 题目大意:给出 n 个节点,再给出 n 个出边,保证所有的边能将 n 个点连通,每条出边可以用 m[ i ] 种材料选择其一建造,然后有 k 个工人,每个工人只可以使用一种材料建造 ...

  5. CodeForces 390E Inna and Large Sweet Matrix(树状数组改段求段)

    CodeForces 390E Inna and Large Sweet Matrix(树状数组改段求段) 树状数组仅仅能实现线段树区间改动和区间查询的功能,能够取代不须要lazy tag的线段树.且 ...

  6. 【基环树DP】[NOI2012]迷失游乐园

    题目描述 Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多 ...

  7. 基环树一些有趣的事情

    基环树,就是有一个环的树.有向基环树又分内向和外向基环树,当然也有无向的. 最近遇到的基环树真不少.有些题目赤裸裸的就告诉你,"给出一棵基环树(环套树)",但是有的题会有一些标志. ...

  8. 【NOI2012】迷失游乐园【概率期望】【换根dp】【基环树】

    传送门 题意:给一棵nnn个点的带边权树或基环树,随机选一个点作为起点,每次随机走到一个相邻未走过的位置,直到无路可走.求期望路径长度. n≤105n \leq 10^5n≤105,为基环树时环的大小 ...

  9. 【NOI2013】快餐店【基环树】【树的直径】【set】

    传送门 题意:给一棵nnn个点的基环树,找一个点(可以在边上),求所有节点到这个点的最大值的最小值. n≤1e5n \leq1e5n≤1e5 先考虑一棵普通树的情况 显然是直径长度的一半 因为如果有个 ...

最新文章

  1. linux apache cpu,linux – Apache使用100%的CPU. “ps”命令可以告诉我它在做什么吗?...
  2. gradle风格的groovy代码
  3. 关于IE8.0 Internet Explorer 已经为了帮助保护您的计算机而关闭此网页 解决方法
  4. 再来一波PHP程序员必看书籍
  5. 希尔伯特曲线的绘制c语言,用四叉树和希尔伯特曲线做空间索引
  6. 转:springboot servlet使用配置
  7. CSS动画实战:创建一个太极Loading图
  8. 自适应个人收款页HTML源码
  9. 二维数组中的查找(java)
  10. Vivado设计流程(五)工程实现
  11. P2540 斗地主增强版
  12. hibernate的Configuration对象的configure()方法的作用
  13. Servlet教程第8讲笔记
  14. win7旗舰版安装oracle11g
  15. PostgreSQL获得去、今、明年份、今年的第一天、去年的第一天转换时区、最后一天等
  16. 瑞典皇家理工学院计算机学什么,瑞典皇家理工学院有哪些研究生专业
  17. CTFshow——web入门——sql注入
  18. 基于ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局
  19. OpenResty学习——第七章 Web开发实战2——商品详情页
  20. 荷兰DELTA电源维修SM66-AR-110德尔塔电源

热门文章

  1. flink启动命令参数_[Flink]Flink1.3 指南四 命令行接口-阿里云开发者社区
  2. 5加载stm32 keil_KEIL 那些编辑技巧与方法
  3. 存储过程语法 - 变量
  4. consumer和partition的数量建议
  5. SQLErrorCodeSQLExceptionTranslator
  6. 数据采集提升性能篇-使用Mybatis的批量操作api导入数据
  7. 缓存-分布式锁-缓存一致性解决
  8. 双主双从(2m-2s)集群介绍和工作流程说明
  9. Bootstrap组件_导航
  10. 如何验证 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题及其原因