[APIO2020]交换城市

description

solution

如果u,vu,vu,v存在于一条链上(只有两个点度数为111其余点度数为222)则无解,否则必有解

如图,不管是哪个点度数>2>2>2,都可以有解

以蓝色为例,第二个红点右移到蓝色右边,第一个红点走进蓝色,第二个红点走到第一个红点开始位置,第一个红点出来回到第二个红点开始位置

因此本题只是在kruskal重构树(每次新建一个点,把两个点连在新点下面当儿子,新点点权即为原两点的边权)的基础上多了一个链判断的维护

不需要用启发式合并,只需要判断siz[u]=cnt[u][1]+cnt[u][2]&&cnt[u][1]==2

code

#include "swap.h"
#include <bits/stdc++.h>
using namespace std;
#define maxn 300005
struct node  {int u, v, w;node(){}node( int U, int V, int W ) {u = U, v = V, w = W;}
}edge[maxn];
vector < int > G[maxn];
int n, m, ip;
int MS[maxn], d[maxn], val[maxn], siz[maxn], g[maxn], dep[maxn];
int f[maxn][20], cnt[maxn][3];bool cmp ( node x, node y ) {return x.w < y.w;
}int find( int x ) {return x == MS[x] ? x : MS[x] = find( MS[x] );
}void dfs( int u, int fa ) {f[u][0] = fa, dep[u] = dep[fa] + 1;for( int i = 1;i < 20;i ++ )f[u][i] = f[f[u][i - 1]][i - 1];if( cnt[u][1] == 2 && cnt[u][1] + cnt[u][2] == siz[u] ) g[u] = g[fa];else g[u] = u;for( int i = 0;i < ( int )G[u].size();i ++ ) {int v = G[u][i];if( v == fa ) continue;else dfs( v, u );}
}void modify( int x, int v ) {if( 1 <= d[x] && d[x] <= 2 ) cnt[find( x )][d[x]] += v;
}void kruskal() {sort( edge + 1, edge + m + 1, cmp );for( int i = 1;i <= n;i ++ ) MS[i] = i, siz[i] = 1;ip = n;for( int i = 1;i <= m;i ++ ) {int u = edge[i].u, v = edge[i].v, w = edge[i].w;int fu = find( u ), fv = find( v );if( fu ^ fv ) {++ ip;cnt[ip][1] = cnt[fu][1] + cnt[fv][1];cnt[ip][2] = cnt[fu][2] + cnt[fv][2];siz[ip] = siz[fu] + siz[fv];MS[fu] = ip, MS[fv] = ip;val[ip] = w;MS[ip] = ip;G[ip].push_back( fu );G[ip].push_back( fv );}else if( val[fu] != w ) {++ ip;cnt[ip][1] = cnt[fu][1];cnt[ip][2] = cnt[fu][2];siz[ip] = siz[fu];MS[fu] = ip;MS[ip] = ip;val[ip] = w;G[ip].push_back( fu );}modify( u, -1 );modify( v, -1 );d[u] ++;d[v] ++;modify( u, 1 );modify( v, 1 );}dfs( ip, 0 );
}int get_lca( int u, int v ) {if( dep[u] < dep[v] ) swap( u, v );for( int i = 19;~ i;i -- )if( dep[f[u][i]] >= dep[v] )u = f[u][i];if( u == v ) return u;for( int i = 19;~ i;i -- )if( f[u][i] != f[v][i] )u = f[u][i], v = f[v][i];return f[u][0];
}void init( int N, int M, vector < int > U, vector < int > V, vector < int > W ) {n = N, m = M;for( int i = 0;i < m;i ++ )edge[i + 1] = node( U[i] + 1, V[i] + 1, W[i] ); kruskal();
}int getMinimumFuelCapacity( int x, int y ) {x ++, y ++;int lca = get_lca( x, y );if( ! g[lca] ) return -1;else return val[g[lca]];
}

完全不能调试的交互题!!!

[APIO2020]交换城市(交互+kruskal重构树)相关推荐

  1. [NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)

    [NOI2018] 归程 description solution1 code1 solution2 code description 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要 ...

  2. LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)

    LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...

  3. 浅谈kruskal重构树

    食用须知: *因为临时改动,代码不一定完全正确. *以下概念来自个人理解,并不十分准确.慎! <Kruskal重构树思想与模板> Kruskal算法(维护无向图的最小生成森林):每一时刻, ...

  4. 洛谷P4768 [NOI2018]归程(Kruskal重构树)

    题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...

  5. 【NOI 2018】归程(Kruskal重构树)

    题面在这里就不放了. 同步赛在做这个题的时候,心里有点纠结,很容易想到离线的做法,将边和询问一起按水位线排序,模拟水位下降,维护当前的各个联通块中距离$1$最近的距离,每次遇到询问时输出所在联通块的信 ...

  6. kruskal 重构树(讲解 + 例题)

    kruskal重构树 如何建树 模仿kruskalkruskalkruskal,先将所有边排序. 依次遍历每一条边,如果这条边的两个节点(u,vu, vu,v)不在同一个连通块里面, 则新建一个nod ...

  7. Network 黑暗爆炸 - 3732 倍增lca || Kruskal重构树

    传送门 文章目录 题意: 思路: 题意: 思路: 两点间最长边最小值一定是最小生成树上两点间的最大值,这个比较容易证,就不多说了. 知道这个结论后, 我们直接跑一个KruskalKruskalKrus ...

  8. [ONTAK2010] Peaks加强版 (kruskal重构树+主席树+倍增)

    Peaks description solution code description 在Bytemountains有N座山峰,每座山峰有他的高度h_i 有些山峰之间有双向道路相连,共M条路径,每条路 ...

  9. AGC002(D~F)【Kruskal重构树,博弈论,dp】

    正题 AT1998 [AGC002D] Stamp Rally[Kruskal重构树,倍增] https://www.luogu.com.cn/problem/AT1998 题目大意 给出nnn个点m ...

最新文章

  1. python闭包主要解决什么问题_关于python中闭包的总结
  2. java中截取字符串的方式
  3. SPOJ 1676 矩阵乘法+DP
  4. mysql移动文件后打不开_Windows端MySQL data目录迁移(貌似会启动不了)
  5. 【Flink】Flink时间之internalTimerService初始化
  6. python 基础 集合
  7. c语言贪吃蛇 纯c,纯C语言贪吃蛇游戏
  8. 计算机论文中期考核报告,硕士学位论文中期检查表范文_中期检查报告范文_中期考核 修改论文题目...
  9. 1位全加器设计—— 原理图与VHDL设计初步
  10. 如何查看计算机主机名称,查看和修改主机名
  11. 三维实时云渲染平台解决方案
  12. 基于JAVA自行车在线租赁管理系统2021计算机毕业设计源码+系统+lw文档+部署
  13. codeforces 607B Zuma 区间dp
  14. mac屏幕保护SaveHollywood安装方法
  15. 【渝粤教育】广东开放大学 广东开放大学学习指引 形成性考核 (28)
  16. Java斗_Java集合练习:斗地主游戏
  17. 热动力数据MATLAB代码分享
  18. 解密支付宝所谓黑科技神码
  19. 【java毕业设计】基于javaEE+原生Servlet+MySql的Web停车场管理系统设计与实现(毕业论文+程序源码)——停车场管理系统
  20. 第十二章:项目采购管理 - (12.0 什么是项目采购管理)

热门文章

  1. 按键精灵MsgBox信息换行方法
  2. Ansys APDL pro/e IGES仿真简单流程
  3. 机器学习之西瓜书绪论--关于机器学习的简单介绍
  4. web前端练习32----Css,盒子模型,display,visibility,overflow,单位em
  5. 社团划分评估-标准化互信息NMI的Python实现
  6. 一些常用的网址,分享给需要的朋友
  7. Linner介绍、安装及简单Demo
  8. win10不能输入中文 shift无法切换键盘
  9. 大专生,怎么找一份Java工作
  10. 四川省计算机考试模拟试题,四川省大学生计算机一级考试全真模拟试题