洛谷传送门

BZOJ传送门

题目描述

比特镇的路网由 mmm 条双向道路连接的 nnn 个交叉路口组成。

最近,比特镇获得了一场铁人两项锦标赛的主办权。这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行车完成第二段赛程。

比赛的路线要按照如下方法规划:

  1. 先选择三个两两互不相同的路口 s,cs, cs,c和 fff,分别作为比赛的起点、切换点(运动员在长跑到达这个点后,骑自行车前往终点)、终点。
  2. 选择一条从 sss 出发,经过 ccc 最终到达 fff 的路径。考虑到安全因素,选择的路径经过同一个点至多一次。

在规划路径之前,镇长想请你帮忙计算,总共有多少种不同的选取 s,cs, cs,c和 fff的方案,使得在第 222步中至少能设计出一条满足要求的路径。

输入输出格式

输入格式:

第一行包含两个整数 nnn和 mmm ,分别表示交叉路口和双向道路的数量。

接下来 mmm行,每行两个整数 vi,uiv_i, u_ivi​,ui​ 。表示存在一条双向道路连接交叉路口 vi,uiv_i, u_ivi​,ui​ (1≤vi,ui≤n,vi≠ui)(1 ≤ v_i, u_i ≤ n,v_i \neq u_i)(1≤vi​,ui​≤n,vi​̸​=ui​)。

保证任意两个交叉路口之间,至多被一条双向道路直接连接。

输出格式:

输出一行,包括一个整数,表示能满足要求的不同的选取 s,cs, cs,c 和 fff 的方案数。

输入输出样例

输入样例#1:

4 3
1 2
2 3
3 4

输出样例#1:

8

输入样例#2:

4 4
1 2
2 3
3 4
4 2

输出样例#2:

14

解题分析

显然缩出点双后, 确定两点之间可以选的中间点就是路径上所有点和点双的点数之和。

考虑把单独一条边也视为一个点双, 那么建出圆方树, 把方点的权值设为点双的大小, 原点的权值设为−1-1−1, 路径上可选中间点数恰好就是路径和, 然后可以转化为计算每点的贡献。

总复杂度O(N)O(N)O(N)。

代码如下:

#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#define R register
#define IN inline
#define MX 200500
#define gc getchar()
#define ll long long
template <class T>
IN void in(T &x)
{x = 0; R char c = gc;for (; !isdigit(c); c = gc);for (;  isdigit(c); c = gc)x = (x << 1) + (x << 3) + c - 48;
}
template <class T> IN T max(T a, T b) {return a > b ? a : b;}
template <class T> IN T min(T a, T b) {return a < b ? a : b;}
int n, m, top, arr, dcnt, sum, cnt;
int head[MX], val[MX], siz[MX], dfn[MX], low[MX], sta[MX], h[MX];
ll ans;
struct Edge {int to, nex;} edge[MX << 2];
IN void add1(R int from, R int to)
{edge[++cnt] = {to, head[from]}, head[from] = cnt;}
IN void add2(R int from, R int to)
{edge[++cnt] = {to, h[from]}, h[from] = cnt;}
void tarjan(R int now)
{dfn[now] = low[now] = ++dcnt;sta[++top] = now; val[now] = -1; ++sum;for (R int i = head[now]; i; i = edge[i].nex){if (!dfn[edge[i].to]){tarjan(edge[i].to);low[now] = min(low[now], low[edge[i].to]);if (low[edge[i].to] == dfn[now]){add2(now, ++arr); val[arr] = 1; int tp = 0;do{tp = sta[top--]; add2(arr, tp);++val[arr];} while (tp ^ edge[i].to);}}else low[now] = min(low[now], dfn[edge[i].to]);}
}
void solve(R int now)
{if (now <= n) siz[now] = 1;for (R int i = h[now]; i; i = edge[i].nex){solve(edge[i].to);ans += 1ll * siz[now] * siz[edge[i].to] * val[now];siz[now] += siz[edge[i].to];}ans += 1ll * (sum - siz[now]) * siz[now] * val[now];
}
int main(void)
{int a, b; in(n), in(m); arr = n;for (R int i = 1; i <= m; ++i){in(a), in(b);add1(a, b), add1(b, a);}for (R int i = 1; i <= n; ++i)if (!dfn[i]) sum = 0, tarjan(i), solve(i);printf("%lld\n", ans * 2);
}

[Luogu P4630] [BZOJ 5463] [APIO2018] Duathlon 铁人两项相关推荐

  1. [APIO2018] Duathlon 铁人两项 圆方树,DP

    [APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话 ...

  2. 洛谷P4630 [APIO2018] Duathlon 铁人两项 【圆方树】

    题目链接 洛谷P4630 题解 看了一下部分分,觉得树的部分很可做,就相当于求一个点对路径长之和的东西,考虑一下能不能转化到一般图来? 一般图要转为树,就使用圆方树呗 思考一下发现,两点之间经过的点双 ...

  3. [APIO2018] Duathlon 铁人两项

    题面 \(LOJ\)自己找.. Sol 建立圆方树 考虑枚举起点\(s\)和终点\(t\) 那么答案就是\(s\)到\(t\)间的点双的点数和减去\(s,t\) 设方点权值为点双的点数,圆点的权值为\ ...

  4. 【APIO2018】Duathlon 铁人两项 【圆方树】

    题意:给一张 nnn 点 mmm 边的简单无向图,求有多少个三元组 (s,c,f)(s,c,f)(s,c,f) ,满足存在一条从 sss 到 fff 经过 ccc 的简单路径. n≤105,m≤2×1 ...

  5. P4630-[APIO2018]Duathlon铁人两项【圆方树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4630 题目大意 nnn个点mmm条边的一张无向图,求有多少对三元组(s,c,f)(s,c,f)(s,c,f)满足 ...

  6. [APIO2018]铁人两项——圆方树+树形DP

    题目链接: [APIO2018]铁人两项 对于点双连通分量有一个性质:在同一个点双里的三个点$a,b,c$,一定存在一条从$a$到$c$的路径经过$b$且经过的点只被经过一次. 那么我们建出原图的圆方 ...

  7. LOJ.2587.[APIO2018]铁人两项Duathlon(圆方树)

    题目链接 LOJ 洛谷P4630 先对这张图建圆方树. 对于S->T这条(些)路径,其对答案的贡献为可能经过的所有点数,那么我们把方点权值设为联通分量的大小,可以直接去求树上路径权值和. 因为两 ...

  8. Luogu P1198 BZOJ 1012 最大数 (线段树)

    Luogu P1198 BZOJ 1012 最大数 (线段树) 手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/a ...

  9. 体验式培训之“铁人七项”

    铁人七项: 铁人七项项目的挑战点是在120秒的时间内完成7项任务,第7项子任务必须最后一个完成,这七项任务中有团队整体完成,有部分成员完成. 1.全组15位成员脚不着地,踩在3张30cm*30cm的垫 ...

  10. 移动应用开发者应该关注的 Google I/O 两项更新

    移动应用开发者看过来,今年 Google I/O 这两项更新能帮上大忙 移动应用开发者看过来,今年 Google I/O 这两项更新能帮上大忙. I/O 的 Keynote 刚刚结束,用户可能为 Go ...

最新文章

  1. Linux vsftp服务
  2. 域名CNAME 概念
  3. 数据库死锁及解决方法
  4. Flutter React编程范式实践
  5. Linux基础命令---findfs
  6. 美国安全厂商在云安全上的最新进展
  7. (翻译)Google Guava Cache
  8. 吉利汽车发布澄清公告:并未与百度公司合作生产智能电动车
  9. 使用python,生成符合zipf分布的数据集
  10. 新知实验室 TRTC实时音视频通讯方案在业内的QoS水平
  11. 安卓psp模拟器联机教程_谁知道手机版的ppsspp模拟器怎么联机啊?
  12. 用python开发一个炸金花小游戏,注意别玩上瘾了
  13. 常用图形渲染API简介
  14. 微信公众号【程序员杂货铺】
  15. 关于ERP系统,你可能不知道的10件事
  16. 【TCP/IP学习笔记1】 C语言讲解
  17. MMA-符号学运算的奥妙
  18. 视频按帧截取 python程序
  19. 江南style印证法国大预言家诺查丹玛斯世界末日预言?
  20. 关于SEO(搜索引擎优化)的个人掌握知识分享

热门文章

  1. python数据建模与预测_Python建模复习:预测型数据挖掘
  2. win10证书服务器不可用怎么办,四种方法解决Win10专业版RPC服务器不可用的问题...
  3. java speex转码_JAVA版-微信语音.speex转.wav
  4. 计算机桌面没有cdef,如何解决电脑CDEF盘都打不开出现“该文件没有程序与之关联来执行该操作”的问题...
  5. EndNote无法修改参考文献格式
  6. Mysql读写分离的原理及配置--amoeba
  7. java项目实现html转pdf的需求(支持中文和CSS样式)
  8. HTML5高级之拖拽drag
  9. mysql 32位_MySQL8下载 MySQL 8 for windows 32位 v8.0.18 官方免费正式版 下载-脚本之家
  10. linux一键安装lamp教程,CentOS7下LAMP一键安装包教程