【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 ...
随机推荐
- javascript重定向页面并用post方法传递消息
javascript中重定向页面得方法很多,同时能传递消息的也不少:但可用post方法传递的我只找到两种: 第一种方法:用document.write在 JavaScript函数中,用document ...
- 几个jdbc小技巧
版本:jdk:1.6mysql-connector-5.0.8 1.如何用jdbc判断某个基本表是否存在 一种比较“笨”的方法: try{ stmt.executeQuery( ...
- CI框架在模型中切换读写库和读写库
如果你想在控制器中切换在application/config/database.php中配置好的数据库group,那么你可以参考这篇博客:CI框架在控制器中切换读写库和读写库 如果你是希望在模型中切换 ...
- HTML,CSS笔记
text-indent 属性规定文本块中首行文本的缩进.允许使用负值.如果使用负值,那么首行会被缩进到左边.p{ text-indent:50px; } HTML <label> 标签的 ...
- winform启动界面+登录窗口
需求场景:先展示启动界面,然后打开登录界面,如果登录成功就跳转到主界面 首先在程序的入口路径加载启动界面,使用ShowDialog显示界面, 然后在启动界面中添加定时器,来实现显示一段时间的效果,等到 ...
- babel(一)
一.babel npm babel src/index.js -d lib 二.@babel/core @babel/cli @babel/core 转换语法核心 @babel/cli 执行 ...
- mysql5.7以上安装
下载:https://dev.mysql.com/downloads/mysql/ 1.在解压的mysql下(bin目录统计),创建my.ini 文件,内容日下(路径根据自己的目录修改) [mysql ...
- springmvc配置文件的主要内容
springmvc配置文件的主要内容:
- day 7-7 线程池与进程池
一. 进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这 ...
- Flutter路由管理
第一点:push使用 1.pushNamed——Navigator.of(context).pushNamed('routeName'); 此种方法只是简单的将我们需要进入的页面push到栈顶,以此来 ...