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次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
随机推荐
- go slice不同初始化方式性能&数组比较
go语言开发中,slice是我们常用的数据类型之一,也是因为它的灵活性,自己也很少使用数组,当然我也知道它的一些特性,不过没有真实的去验证它,因为大多数使用场景没必要对code太过苛刻,但是如果封装作 ...
- SpringCloud Alibaba(三) - GateWay网关
1.基本环境搭建 1.1 依赖 <!-- Gatway 网关会和springMvc冲突,不能添加web依赖 --> <dependency> <groupId>or ...
- 【极客时间】大数据概述及HDFS介绍
- ast在爬虫上的应用
https://astexplorer.net/ https://zhuanlan.zhihu.com/p/371710865 1.基础了解 const {parse} =require(" ...
- JavaScript Promises, async/await
new Promise() 的时候,传一个 executor 给 Promise. let promise = new Promise(function(resolve, reject) { // t ...
- JAVA中的注解可以继承吗?
前言 注解想必大家都用过,也叫元数据,是一种代码级别的注释,可以对类或者方法等元素做标记说明,比如Spring框架中的@Service,@Component等.那么今天我想问大家的是类被继承了,注解能 ...
- 周结之json补充、正则re模块、hashlib模块、logging模块
周结 目录 周结 json补充 正则表达式 re模块 第三方模块的下载 request模块 办公自动化openpyxl模块 hashlib加密模块 subprocess模块 logging日志模块 j ...
- Django之ORM表高级操作、增删改查、外键字段连表查、单表查、跨表查、F/Q查询
目录 一.如何开启自己的测试脚本? 二.对表数据的添加.更新.删除 1.create() 变态操作之批量插入数据 2.update() 3.delete() 4.如何查看QuerySet对象执行的sq ...
- 后疫情办公时代——你需要的多人同步协同编辑Demo(可粘贴可撤销)
新冠病毒的疫情使得在线办公成为了一个常态,这使得在线文档成为了时下的热点.其中在线协同表格是在线文档的重要一个组成部分,纯前端表格在在线协同表格上有着得天独厚的优势:本身已经实现了单人操作在线文档的基 ...
- 2、postman调试
Postman接口调试: postman博客参考 Postman是一个API(接口)开发协作平台,其提供了发送请求.检查响应.自动化测试.数据模拟.服务监控.文档分享等一系列与API(接口)开发有关的 ...