【AtCoder2134】ZigZag MST(最小生成树)
【AtCoder2134】ZigZag MST(最小生成树)
题面
题解
这题就很鬼畜。。
既然每次连边,连出来的边的权值是递增的,所以拿个线段树xjb维护一下就可以做了。那么意味着只有前面的点集被连在一起之后才可能选择后面的边,因此我们可以强制修改一下边的连接方式,只需要把新加入的点和联通块中的任意一个点连接在一起就好了。那么可以先在\((A,B)\)之间连一条权值为\(C\)的边,接下来的所有边都可以连成\((A,A+1),(A+1,A+2)\)的形式。
这样子就可以把所有点排成一个环,维护相邻两个点之间的权值的最小值,那么可以从最小值开始把整个环扫一遍来更新整个环的答案。
这样子一共就产生了\(n+Q\)条边,直接跑克鲁斯卡尔就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAX 200200
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int u,v,w;}e[MAX<<1];
bool operator<(Line a,Line b){return a.w<b.w;}
int n,Q,m,v[MAX],f[MAX];long long ans=0;
int getf(int x){return x==f[x]?x:f[x]=getf(f[x]);}
int main()
{
n=read();Q=read();memset(v,127,sizeof(v));
while(Q--)
{
int A=read()+1,B=read()+1,C=read();
e[++m]=(Line){A,B,C};
v[A%n+1]=min(v[A%n+1],C+1);
v[B%n+1]=min(v[B%n+1],C+2);
}
int pos=1;
for(int i=2;i<=n;++i)if(v[i]<v[pos])pos=i;
for(int i=pos%n+1,j=pos;i!=pos;j=i,i=i%n+1)v[i]=min(v[i],v[j]+2);
for(int i=2;i<=n;++i)e[++m]=(Line){i-1,i,v[i]};
e[++m]=(Line){1,n,v[1]};
sort(&e[1],&e[m+1]);
for(int i=1;i<=n;++i)f[i]=i;
for(int i=1;i<=m;++i)
{
int u=getf(e[i].u),v=getf(e[i].v);
if(u==v)continue;
ans+=e[i].w;f[u]=v;
}
printf("%lld\n",ans);
return 0;
}
【AtCoder2134】ZigZag MST(最小生成树)的更多相关文章
- 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$(画 ...
- [题解] [AtCoder2134] Zigzag MST
题面 题解 考虑kruscal的过程 对于三个点\(x, y, x + 1\), 我们可以将\((x, y, z), (y, x + 1, z + 1)\)看做\((x, y, z), (x, x + ...
- Atcoder2134 Zigzag MST
问题描述 We have a graph with N vertices, numbered 0 through N−1. Edges are yet to be added. We will pro ...
- MST最小生成树
首先,贴上一个很好的讲解贴: http://www.wutianqi.com/?p=3012 HDOJ 1233 还是畅通工程 http://acm.hdu.edu.cn/showproblem.ph ...
- [BZOJ1937][SHOI2004]Mst最小生成树(KM算法,最大费用流)
1937: [Shoi2004]Mst 最小生成树 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 802 Solved: 344[Submit][Sta ...
- 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)
[BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...
- 【题解】 AT2134 Zigzag MST
[题解]AT2134 Zigzag MST 一道MST好题 \(Anson\)有云: 要么是减少边的数量. 要么是改变连接边的方式. 那么如何减少边的数量呢?很简单,把所有不可能对答案产生贡献的边去掉 ...
- [poj1679]The Unique MST(最小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28207 Accepted: 10073 ...
随机推荐
- charles如何设置弱网
- hadoop和java 配置环境变量的的tar
第一步:打开工具上传tar包 如下图 第二步:在文件路径下查看是否上传成功 第三步:解压tar包 tar -zxvf hadoop.2.6.5.tar.gz 第四步:配置环 ...
- Linux之hosts文件
一.序言: 今天同事部署环境遇到问题, 原因1:修改了主机名,在/etc/hosts文件中加了3台集群的ip和主机名,但是将默认的前两行也改了,没注意看改了哪里, 现象: 1.zookeeper单台可 ...
- 多线程系列之七:Read-Write Lock模式
一,Read-Write Lock模式 在Read-Write Lock模式中,读取操作和写入操作是分开考虑的.在执行读取操作之前,线程必须获取用于读取的锁.在执行写入操作之前,线程必须获取用于写入的 ...
- Migrate MySQL database using dump and restore
kaorimatz/mysqldump-loader: Load a MySQL dump file using LOAD DATA INFILEhttps://github.com/kaorimat ...
- 通过爬虫程序深入浅出java 主从工作模型
随手做的爬虫程序在 https://github.com/rli07/master_java/blob/master/spider.zip 可下载. 这是我做的系统学习图, 可以参考一下 系统架 ...
- 简单理解laravel框架中的服务容器,服务提供者以及怎样调用服务
laravel被称为最优雅的框架,最近正在学习中,对于用惯了thinkphp.ci框架的人来说,服务容器.服务提供者,依赖注入这些概念简直是一脸懵逼.我花了些时间梳理了一下,也不敢确定自己说的是对 ...
- springmvc中model可以封装的数据类型
查看源码可以知道,model中可以存放的数据类型 Model addAttribute(String var1, @Nullable Object var2); Model addAttribute( ...
- 在编写wpf界面时候中出现如下错误: 类型引用不明确。至少有两个名称空间(“System.Windows”和“System.Windows”)中已出现名为“VisualStateManager”的类型。请考虑调整程序集 XmlnsDefinition 特性。
wpf中类型引用不明确.至少有两个名称空间(“System.Windows”和“System.Windows”)中已出现名为“VisualState 你是不是用了WPFToolKit?如果是的,那原因 ...
- spring 标签
*/ @Slf4j @Service public class RetryService { @Autowired private MqConfig mqConfig; /** * 如果网络连接失败, ...