[题解] [AtCoder2134] Zigzag MST
题面
题解
考虑kruscal的过程
对于三个点\(x, y, x + 1\), 我们可以将\((x, y, z), (y, x + 1, z + 1)\)看做\((x, y, z), (x, x + 1, z + 1)\)
因为当连完\((x, y, z)\)后, \(x\)与\(y\)已经联通, 所以\((y, x + 1, z + 1)\)和\((x, x + 1, z + 1)\)是等价的
所以对于每个连边操作, 我们就变成了连一条边和一个环
考虑怎么优化环上的边的数量
对于这两条边\((x, x + 1, z + 1), (x + 1, x + 2, z + 3)\)
可以发现第二条边的权值就是第一条边的权值+2
所以我们可以用\(f[i]\)代表\(i\)到\(i \% n + 1\)中边权最小的边, 然后更新一圈, 跑一遍最小生成树即可
Code
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#define itn int
#define reaD read
#define N 200001
using namespace std;
int n, Q, f[N], cnt, fa[N];
struct edge { int from, to, cost; bool operator < (const edge &p) const { return cost < p.cost; } } e[N << 2];
inline int read()
{
int x = 0, w = 1; char c = getchar();
while(c < '0' || c > '9') { if (c == '-') w = -1; c = getchar(); }
while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * w;
}
inline void adde(int u, int v, int w) { e[++cnt] = (edge) { u, v, w }; }
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
long long Kruscal()
{
sort(e + 1, e + cnt + 1);
long long ans = 0;
for(int i = 1; i <= cnt; i++)
{
int u = find(e[i].from), v = find(e[i].to), w = e[i].cost;
if(u == v) continue;
fa[u] = v; ans += w;
}
return ans;
}
int main()
{
n = read(); Q = read();
for(int i = 1; i <= n; i++) fa[i] = i;
memset(f, 0x3f, sizeof(f));
while(Q--)
{
int u = read() + 1, v = read() + 1, w = reaD();
adde(u, v, w);
f[u] = min(f[u], w + 1); f[v] = min(f[v], w + 2);
}
int pos = 1;
for(int i = 2; i <= n; i++) if(f[i] < f[pos]) pos = i;
for(int i = pos; i <= pos + n - 1; i++) f[i % n + 1] = min(f[i % n + 1], f[(i - 1) % n + 1] + 2);
for(int i = 1; i <= n; i++) adde(i, i % n + 1, f[i]);
printf("%lld\n", Kruscal());
return 0;
}
[题解] [AtCoder2134] Zigzag MST的更多相关文章
- 题解 [AT2134] Zigzag MST
题面 解析 我们先考虑一下加一条边(x,y,z)会成什么亚子: (还有很多边不画了...) 然后我们把这个图单独拿出来: 我们可以发现,对于最小生成树的贡献, 它是等价于下面这张图的(因为连通性一样) ...
- Atcoder2134 Zigzag MST
问题描述 We have a graph with N vertices, numbered 0 through N−1. Edges are yet to be added. We will pro ...
- 【AtCoder2134】ZigZag MST(最小生成树)
[AtCoder2134]ZigZag MST(最小生成树) 题面 洛谷 AtCoder 题解 这题就很鬼畜.. 既然每次连边,连出来的边的权值是递增的,所以拿个线段树xjb维护一下就可以做了.那么意 ...
- 【题解】 AT2134 Zigzag MST
[题解]AT2134 Zigzag MST 一道MST好题 \(Anson\)有云: 要么是减少边的数量. 要么是改变连接边的方式. 那么如何减少边的数量呢?很简单,把所有不可能对答案产生贡献的边去掉 ...
- leetcode题解 6.ZigZag Conversion
6.ZigZag Conversion 题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a gi ...
- AT2134 Zigzag MST
题面 题解 这个题目主要是连边很奇怪,但是我们可以发现一个性质:权值是递增的. 于是像下图的连边:(加边方式为\((A_1, B_1, 1)\)) 其实可以等价于如下连边: 于是我们将其变成了在环上连 ...
- 《LeetBook》leetcode题解(6): ZigZag Conversion[E]
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- AT2134 Zigzag MST 最小生成树
正解:最小生成树 解题报告: 先放下传送门QAQ 然后这题,首先可以发现这神奇的连边方式真是令人头大,,,显然要考虑转化掉QAQ 大概看一下可以发现点对的规律是,左边++,交换位置,再仔细想下,就每个 ...
- Atcoder CODE FESTIVAL 2016 Final G - Zigzag MST[最小生成树]
题意:$n$个点,$q$次建边,每次建边选定$x,y$,权值$c$,然后接着$(y,x+1,c+1),(x+1,y+1,c+2),(y+1,x+2,c+3),(x+2,y+2,c+4)\dots$(画 ...
随机推荐
- 【原创】大叔经验分享(67)spring boot启动报错
spring boot 启动报错: Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback Logg ...
- 快速写个node命令行工具
1.package.json-bin配置 [创建bat文件,把bat路径添加到PATH中]这些固定的工作可以由npm帮我们完成.package.json中有个bin字段配置: bin: { " ...
- jboss日志的自定义
最近由于想着每次调试socket接收数据情况都需要源码debug好麻烦,要是能把接收到的数据输出到一个单独的日志文件,那出问题的时候,查看问题就方便多了. log4j的日志是可以很方便自定义的,只是这 ...
- SVN主从备份
SVN主从备份 两套环境:192.168.67.63(主SVN) 192.168.67.60(从SVN) 1.主环境上已经装好SVN并且存在数据仓库/home/svndata在从环境上,新建一/hom ...
- Delphi最新的路线图
没想到,官方又发布了一个路线图,同上一个相比,多了10.3.3版本,而其中,最主要的iOS 13支持,即下半年发布的新的苹果系统,再一个就是android 64的delphi支持!年底前发布,够官忙伙 ...
- 第十章、jupyter入门之pandas
目录 第十章.jupyter入门之pandas 一.什么是pandas 二.Series 三.基本概念 四.基本运算 五.DataFrame 第十章.jupyter入门之pandas 一.什么是pan ...
- UNetbootin安装linux
用u盘安装linux系统,最好的方法莫过于用UNetbootin,网址:http://unetbootin.github.io/ UNetbootin allows you to create boo ...
- Oracle【二维表的维护】
二维表的维护 --添加新的字段:alter table 表名 add 字段名 类型 [一般不加约束条件] ) 原表:新增字段后的表:修改原有的字段:[修改字段类型.修改字段名.删除字段] --修改字段 ...
- iptables实现内外网端口映射及转发上网
前两天在工作中遇到一个需求,某192.168.1.0/24内网网段内只有一台主机A连接到了公网,A的两块网卡分别有一个公网地址(123.234.345.456)和一个内网地址(192.168.1.10 ...
- PhotoShop更改图片背景色
PhotoShop更改图片背景色 操作步骤如下所示: 打开图片==>图像/调整/替换颜色==>选择颜色==>选择油漆桶工具==>点击需要被替换的图片背景色 注:不知道什么原因 ...