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次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
随机推荐
- nuxt作为主应用接入qiankun的实践(附代码)
上半年一直在倒腾qiankun,在使用nuxtjs接入qiankun时遇到了一些坑,记录并分享出来,希望能帮助到大家. 代码地址:nuxtjs-qiankun-demo Nuxtjs接入qiankun ...
- 基于opencv实现简单人脸检测
作用:在视频中自动检测出人脸 使用内容:灰度转换,分类器,矩形框选,圆形框选,摄像头读取及释放 代码逻辑: 先读取摄像头后, 对摄像头拍摄到的图片进行逐帧分析, 并对图像进行灰度转换后使用类选择器识别 ...
- 简易博客页面小项目 html css
项目预览 代码 html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- MySQL可视化软件(Navicat)部署与使用
目录 一:可视化软件(Navicat) 1.什么是可视化软件? 2.什么是Navicat? 二:部署MySQL(Navicat) 1.Navicat连接本地MySQL 2.连接MySQL,输入密码,在 ...
- jmeter Foreach 控制器与json提取器/正则表达式
适用场景:对某些业务数据依次操作 如:删除某个用户下的所有人员数据,无批量删除接口时,只能循环调用删除人员接口,直到删除完成 返回数据格式: 1. 使用json提取器或正则表达式提取业务数据(jso ...
- 痞子衡嵌入式:Farewell, 我的写博故事2022
-- 题图:苏州荷塘月色 2022 年的最后一天,写个年终总结.困扰大家三年之久的新冠疫情终于在 12 月全面放开了,痞子衡暂时还没有阳,计划坚持到总决赛.对于 2023 年,痞子衡还是充满期待的,慢 ...
- [OpenCV实战]29 使用OpenCV实现红眼自动去除
目录 1 红眼消除 1.1 眼部检测 1.2 红眼遮掩 1.3 清除瞳孔掩模空洞 1.4 红眼修复 2 结果与完整代码 2.1 结果 2.2 代码 3 参考 在本教程中,我们将学习如何完全自动地从照片 ...
- 模型驱动设计的构造块(下)——DDD
3. 领域对象的生命周期 每个对象都有生命周期,如下图所示.对象自创建后,可能会经历各种不同的状态,直至最终消亡--要么存档,要么删除.当然很多对象是简单的临时对象,仅通过调用构造函数来创建,用来做一 ...
- Java基础篇——Gui编程
AWT 抽象窗口工具 组件:按钮(button) 文本域(textarea) 标签(label) 容器(container)... Frame窗口 Frame frame = new Frame( ...
- 题解P3847 [TJOI2007]调整队形
简要题意 给出一个长度为 \(n\) 的序列 \(A\),你需要执行下面的操作,将这个序列变成回文序列: 在序列左右侧或中间插入一个元素,元素数值任意. 删除一个元素. 更改一个元素的值. \(1 \ ...