题目链接

洛谷P4630

题解

看了一下部分分,觉得树的部分很可做,就相当于求一个点对路径长之和的东西,考虑一下能不能转化到一般图来?
一般图要转为树,就使用圆方树呗

思考一下发现,两点之间经过的点双,点双内所有点一定都可以作为中介点
那么我们将方点赋值为点双大小,为了去重,剩余点赋值\(-1\)
答案就是任意两点间权值和之和

我们只需枚举每个点被经过多少次,这就很容易计算了

复杂度\(O(n)\)

#include<algorithm>
#include<iostream>
#include<cstdio>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define LL long long int
using namespace std;
const int maxn = 400005,maxm =1000005,INF = 1000000000;
inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag;
}
int hh[maxn],Ne = 1,h[maxn],ne = 1;
struct EDGE{int from,to,nxt;}e[maxm],ed[maxm];
inline void build(int u,int v){e[++Ne] = (EDGE){u,v,hh[u]}; hh[u] = Ne;e[++Ne] = (EDGE){v,u,hh[v]}; hh[v] = Ne;
}
inline void add(int u,int v){ed[++ne] = (EDGE){u,v,h[u]}; h[u] = ne;ed[++ne] = (EDGE){v,u,h[v]}; h[v] = ne;
}
int n,m,val[maxn],dfn[maxn],low[maxn],inst[maxn],st[maxm],top,cnt,N;
void combine(int rt){val[++N] = 1;add(N,rt);while (st[top] != rt && low[st[top]] >= dfn[rt]){inst[st[top]] = false;add(N,st[top--]),val[N]++;}
}
void dfs(int u,int s){dfn[u] = low[u] = ++cnt; st[++top] = u; inst[u] = true;for (int k = hh[u],to; k; k = e[k].nxt){if (k == s) continue;if (!dfn[to = e[k].to]){dfs(to,k ^ 1);if (low[to] > dfn[u]){top--; val[++N] = 2;add(u,N); add(N,to);}else if (low[to] == dfn[u]) combine(u);low[u] = min(low[u],low[to]);}else if (inst[to]) low[u] = min(low[u],dfn[to]);}
}
int fa[maxn];
LL siz[maxn],ans,sum;
void DFS(int u){siz[u] = u <= n ? 1 : 0;Redge(u) if ((to = ed[k].to) != fa[u]){fa[to] = u,DFS(to),siz[u] += siz[to];}LL tot = u <= n ? sum - 1 : 0;Redge(u) if ((to = ed[k].to) != fa[u]){tot += siz[to] * (sum - siz[to]);}tot += (sum - siz[u]) * siz[u];ans += tot * val[u];
}
int main(){N = n = read(); m = read();REP(i,m) build(read(),read());REP(i,n) val[i] = -1;REP(i,n) if (!dfn[i]){sum = cnt; top = 0; dfs(i,-1);sum = cnt - sum; DFS(i);}printf("%lld\n",ans);return 0;
}

总结

1、圆方树的写法
2、点双的写法
3、一般图考虑树的做法的时候,可以考虑建圆方树

转载于:https://www.cnblogs.com/Mychael/p/9190204.html

洛谷P4630 [APIO2018] Duathlon 铁人两项 【圆方树】相关推荐

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

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

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

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

  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. LOJ.2587.[APIO2018]铁人两项Duathlon(圆方树)

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

  7. 洛谷 :P5236 【模板】静态仙人掌(圆方树模板 + 仙人掌最短路)

    题意很简单,在仙人掌图上求两点的最短路. 做法:需要用到圆方树 先来看看什么是圆方树:圆方树,就是由仙人掌图转化而来,树上分两种点:圆点和方点,圆点是仙人掌图上的点,方点是由仙人掌的环转化而来. 由于 ...

  8. [BZOJ4889][洛谷P3759][TJOI2017]不勤劳的图书管理员 分块+树状数组

    题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打乱顺序的书, ...

  9. 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】

    题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空 ...

最新文章

  1. 深入理解 Mybatis 插件开发
  2. 零基础入门学习Python(16)-函数1,Python的乐高积木
  3. 神技能!研究人员利用扫描仪成功从物理隔离设备中偷出数据
  4. Python时间戳转时间
  5. python打开一个文件-python文件的读写
  6. RocketMQ-- 一对多 (消费者与生产者)
  7. shell脚本练习(12.8)
  8. 单行、多行文本超出显示省略号
  9. 织梦文章页模板使用php语法,织梦文章页面模板顶一下踩一下调用教程
  10. 记一次悲惨的excel导出事件
  11. paip.JAVA的优缺点相比C#.NET VC425
  12. JavaScript表单验证
  13. 关于小波分解的滤波器理解
  14. 输入一英文字符串(字符串长度限制在200个字符以内),单词间仅用一个或多个空格间隔(即没有标点符号),编写程序将此字符串中第1个最长的单词输出。 输入输出样例: memory has no re
  15. win10内存满载测试软件,Windows 10 内置的内存条检查工具Memory Diagnostics Tool
  16. 小程序报错提示Unexpected token in JSON at position
  17. indesign怎么拼图_用R来拼图和排版,告别AI和PS(二):调节宽度和高度
  18. VGPNet:基于灭点的道路和路面标志的检测与识别
  19. sql 一条语句统计男女人数
  20. java通讯录课程设计_java课程设计_通讯录_通讯簿.doc

热门文章

  1. ruby + phantomjs 自动化测试 - GA
  2. 屠龙之路_坚持就是胜利_NinthDay
  3. android stuido 在线安装svn插件,添加版本库无响应
  4. 图解RHEL6安装过程、VMware-tools的安装及repo仓库的配置
  5. 关于 Web Deployment Projects
  6. STC89C52 STC89LE52 NRF24L01无线 教程 (一)
  7. Android 4.4.2 动态添加JNI库方法记录 (二 app应用层)
  8. python持久化存储文件操作
  9. 在家办公这些天整理的Kafka知识点大全
  10. 《动森》里那些看不见的声音设计