JZOJ 3527.迷宫花坛(garden)
题面


思路
考场想到 \(tarjan\) 缩点
然而忘了缩点怎么打
于是甩了个暴力
改题时学了个圆方树
发现挺好用
于是······注意重边
\(Code\)
#include<cstdio>
#include<iostream>
#include<cmath>
#include<map>
using namespace std;
const int N = 3e5 + 5;
int n , m , q , cnt , tot1 , tot2 , top , dfc;
int p[N][2] , h1[N] , h2[N] , dfn[N] , low[N] , df[N] , f[N][22] , fa[N][22] , dep[N];
map<pair<int , int> , int> mp;
struct edge1{
int nxt , to , w;
}e1[N * 2];
struct edge2{
int nxt , to , w;
}e2[N * 2];
struct node{
int x , z;
}stack[N];
void add1(int x , int y , int z)
{
e1[++tot1] = edge1{h1[x] , y , z};
h1[x] = tot1;
}
void add2(int x , int y , int z)
{
e2[++tot2] = edge2{h2[x] , y , z};
h2[x] = tot2;
}
void tarjan(int x , int fa , int z)
{
stack[++top] = node{x , z};
low[x] = dfn[x] = ++dfc;
for(register int i = h1[x]; i; i = e1[i].nxt)
{
int v = e1[i].to;
if (!dfn[v])
{
tarjan(v , x , e1[i].w) , low[x] = min(low[x] , low[v]);
if (dfn[x] < low[v]) add2(x , v , e1[i].w) , df[v] = e1[i].w , --top;
else if (dfn[x] == low[v])
{
int BBC = 0 , tp = top;
for(register int j = h1[x]; j; j = e1[j].nxt)
if (e1[j].to == stack[top].x){BBC = e1[j].w; break;}
add2(x , ++cnt , 0);
while (stack[tp].x != x) df[stack[tp].x] = BBC , BBC += stack[tp].z , --tp;
while (stack[top].x != x)
add2(cnt , stack[top].x , min(df[stack[top].x] , BBC - df[stack[top].x])) , --top;
df[cnt] = BBC;
}
}
else if (v != fa) low[x] = min(low[x] , dfn[v]);
}
}
void dfs(int x , int d)
{
dep[x] = d;
for(register int i = 1; i <= 20; i++)
if (fa[x][i - 1]) fa[x][i] = fa[fa[x][i - 1]][i - 1] , f[x][i] = f[x][i - 1] + f[fa[x][i - 1]][i - 1];
else break;
for(register int i = h2[x]; i; i = e2[i].nxt)
{
fa[e2[i].to][0] = x , f[e2[i].to][0] = e2[i].w;
dfs(e2[i].to , d + 1);
}
}
int getans(int x , int y)
{
int u = x , v = y;
if (dep[u] < dep[v]) swap(u , v);
int deep = dep[u] - dep[v] , res = 0;
for(register int i = 0; i <= 20; i++)
if (deep & (1 << i)) res += f[u][i] , u = fa[u][i];
if (u == v) return res;
for(register int i = 20; i >= 0; i--)
if (fa[u][i] != fa[v][i]) res += f[u][i] + f[v][i] , u = fa[u][i] , v = fa[v][i];
if (fa[u][0] <= n) return res + f[u][0] + f[v][0];
return res + min(abs(df[u] - df[v]) , df[fa[u][0]] - abs(df[u] - df[v]));
}
int main()
{
freopen("garden.in" , "r" , stdin);
freopen("garden.out" , "w" , stdout);
scanf("%d%d" , &n , &m);
int x , y , z;
for(register int i = 1; i <= m; i++)
{
scanf("%d%d%d" , &x , &y , &z);
if (x > y) swap(x , y);
p[i][0] = x , p[i][1] = y;
if (mp[make_pair(x , y)] == 0) mp[make_pair(x , y)] = z;
else mp[make_pair(x , y)] = min(mp[make_pair(x , y)] , z);
}
for(register int i = 1; i <= m; i++)
{
x = p[i][0] , y = p[i][1] , z = mp[make_pair(x , y)];
add1(x , y , z) , add1(y , x , z);
}
cnt = n;
tarjan(1 , 0 , 0);
dfs(1 , 0);
scanf("%d" , &q);
for(register int i = 1; i <= q; i++)
{
scanf("%d%d" , &x , &y);
printf("%d\n" , getans(x , y));
}
}
JZOJ 3527.迷宫花坛(garden)的更多相关文章
- 【Noip模拟 20160929】花坛迷宫
题目描述 圣玛格丽特学园的一角有一个巨大.如迷宫般的花坛.大约有一个人这么高的大型花坛,做成迷宫的形状,深受中世纪贵族的喜爱.维多利加的小屋就坐落在这迷宫花坛的深处.某一天早晨,久城同学要穿过这巨大的 ...
- C语言动态走迷宫
曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...
- POJ 2251 Dungeon Master(3D迷宫 bfs)
传送门 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28416 Accepted: 11 ...
- BZOJ 3527: [Zjoi2014]力
Description 求 \(E_i=\sum _{j=0}^{i-1} \frac {q_j} {(i-j)^2}-\sum _{j=i+1}^{n-1} \frac{q_j} {(i-j)^2} ...
- BFS_Maze_求解迷宫最短路径
/* 10 10 #.######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .## ...
- 【刷题笔记】I'm stuck! (迷宫)-----java方案
题目描述 : 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此 ...
- HDU5977 Garden of Eden(树的点分治)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5977 Description When God made the first man, he ...
- canvas实例 ---- 制作简易迷宫(一)
这个系列分为两部分,第一部分为迷宫的生成及操作,第二部分为自动寻路算法. 我们先看效果: See the Pen QGKBjm by fanyipin (@fanyipin) on CodePen. ...
- HTML 迷宫
今天补个遗,将很久以前研究 HTML5 的时候写的生成迷宫.迷宫寻路程序整理出来. 下载链接在文章最后. 简介 为什么要做这个 HTML5 迷宫程序?因为我喜欢.我愿意.也是向老程序员学习(见第5节) ...
- 洛谷P1605 迷宫——S.B.S.
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
随机推荐
- 2.5:Python常用内置数据结构、多维数组ndarray、Series和DataFrame
一.Python内置数据结构 1.赋值生成列表 la=[1,2,3,4] la 2.强制转换为列表 lb=list("Hello") lb 3.推导式生成列表 s="ab ...
- 关键字break和continue
关键字:break 和continue提供了另一种控制循环的方式. break 是直接退出循环体 如: continue 是退出当前循环迭代 如: 需要注意的是:使用过多的break和continu ...
- appium环境搭建(从入门到放弃)
一.appium环境搭建 1.python3 python3的下载安装这里就不多做介绍了,当然你也可以选择自己喜欢的语音,比如java.... 2.jdk 1)下载地址 官网(需登录账号): http ...
- mysql报错:【系统出错。发生系统错误 1067。进程意外终止。】解决
目录 问题描述 错误排查 1.检查3306端口是否被占用 2.使用window事件查看器 总结 问题描述 使用管理员cmd,任务管理器均无法启动mysql. 报错提示信息:系统出错.发生系统错误 10 ...
- 静态文件配置,django连接MySQL,ORM基本操作
静态文件 什么是静态文件 静态文件是不怎么经常变化的文件,主要针对html文件所使用的到的各种资源. css文件.js文件.img文件.第三方框架文件 django针对静态文件资源需要单独开始一个目录 ...
- SQL注入问题、视图、触发器、事物、存储过程、函数、流程控制、索引相关概念、索引数据结构、慢查询优化、
目录 SQL注入问题 视图 触发器 事物 存储过程 函数 流程控制 索引相关概念 索引数据结构 慢查询优化 测试装备 联合索引 全文检索 插入数据 更新数据 删除数据 主键 外键 重命名表 事物 安全 ...
- 从工具到实践:如何在GitHub上保障开源项目安全?
1998年,Christine Peterson创造了 "开源软件"这个词.她解释道:"这是刻意为之,为了让其他人更容易理解这个领域".同年,O'Reilly组 ...
- CH579(Cortex-M0)网络IAP升级介绍及问题解答--(持续更新) 网络升级
CH579网络IAP升级的源码可以从码云(Gitee)上git clone下来. 码云地址:https://gitee.com/maji19971221/wch-ch57x 以下是一个朋友问的几个常见 ...
- VUE引入自定义文字方式
单vue文件引入老是报错,所以我用了全局引入 1.先在assets里新建font文件夹,把字体放进去,然后在字体旁边新建font.less, font.less内容如下: @font-face{ fo ...
- Unity打包资源,进行后台加载
Unity打包资源,进行后台加载 需要项目优化的pa you,这边走:Unity项目优化--Web版 一.前言 因为在下载Three.js,所以趁着这个时间写一下资源打包加载吧 小黑在刚开始学习Uni ...