正解:最小生成树

解题报告:

先放下传送门QAQ

然后这题,首先可以发现这神奇的连边方式真是令人头大,,,显然要考虑转化掉QAQ

大概看一下可以发现点对的规律是,左边++,交换位置,再仔细想下,就每个点会连上相邻两点,也就相邻两点会通过另外一个点连边

首先可以发现加到后来已经是麻油意义的了,想下kruscal的意义,当两条边的两端是一样的那显然权值大的那条边麻油意义的,就是说每次最多加n条边

这时候再结合prim,可以发现我们每次加入一个不在联通块的点的时候我们一点也不关心它和哪个点相连的,只要知道和联通块的最短距离多少就好

所以如果有(a,b,c),(b,a+1,c+1),考虑到ab早晚在一个联通块中的,所以可以直接当做是(a,a+1,c+1)

不难想到这样把所有边都处理完之后得到的就是一堆[(a,a+1),w]的边了(这儿这么写的意义是说a和a+1是固定的然而对应了很多w

于是再递推两遍(考虑到环所以是两遍呢QAQ)得到所有(a,a+1)唯一的w,这样就变成了一棵新树,再跑遍最小生成树就好QAQ

然后上面是想法,但是这个想法有一个问题昂,就是它的边还是太多了,所以考虑怎么再优化

可以考虑差分,开个mn[]存当前节点的min,对每个修改就只要修改端点就成

然后最后扫一圈,新的边权就是min(mn[i],mn[i-1]+1)

然后再仔细想下发现,因为它是环,所以要扫两次

然后就做完辣辣辣!

顺便说下,这题非常好地体现了关于最小生成树的两种常见解题策略——去除不可能的边&在不影响答案的情况下改边

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define rg register
#define gc getchar()
#define rp(i,x,y) for(rg int i=x;i<=y;++i) const int N=+;
int n,q,fa[N];
ll mn[N<<],as;
struct ed{int fr,to;ll wei;};
vector<ed>edge; il int read()
{
rg char ch=gc;rg int x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il ll readl()
{
rg char ch=gc;rg ll x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il bool cmp(ed x,ed y){return x.wei<y.wei;}
il int fd(int x){return fa[x]==x?x:fa[x]=fd(fa[x]);} int main()
{
// freopen("zm.in","r",stdin);freopen("zm.out","w",stdout);
n=read();q=read();memset(mn,/,sizeof(mn));
while(q--){int a=read()%n+,b=read()%n+;ll c=readl();mn[a]=min(mn[a],c+);mn[b]=min(mn[b],c+);edge.push_back((ed){a,b,c});}
rp(i,,n<<)mn[i]=min(mn[i],mn[i-]+);rp(i,,n)edge.push_back((ed){i,i%n+,min(mn[i],mn[i+n])});sort(edge.begin(),edge.end(),cmp);
rp(i,,n)fa[i]=i;int sz=edge.size();rp(i,,sz-){int fafr=fd(edge[i].fr),fato=fd(edge[i].to);if(fafr^fato)as+=edge[i].wei,fa[fafr]=fato;}
printf("%lld\n",as);
return ;
}

然后放代码!overr!

AT2134 Zigzag MST 最小生成树的更多相关文章

  1. 【题解】 AT2134 Zigzag MST

    [题解]AT2134 Zigzag MST 一道MST好题 \(Anson\)有云: 要么是减少边的数量. 要么是改变连接边的方式. 那么如何减少边的数量呢?很简单,把所有不可能对答案产生贡献的边去掉 ...

  2. 题解 [AT2134] Zigzag MST

    题面 解析 我们先考虑一下加一条边(x,y,z)会成什么亚子: (还有很多边不画了...) 然后我们把这个图单独拿出来: 我们可以发现,对于最小生成树的贡献, 它是等价于下面这张图的(因为连通性一样) ...

  3. 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$(画 ...

  4. AT2134 Zigzag MST

    题面 题解 这个题目主要是连边很奇怪,但是我们可以发现一个性质:权值是递增的. 于是像下图的连边:(加边方式为\((A_1, B_1, 1)\)) 其实可以等价于如下连边: 于是我们将其变成了在环上连 ...

  5. 【AtCoder2134】ZigZag MST(最小生成树)

    [AtCoder2134]ZigZag MST(最小生成树) 题面 洛谷 AtCoder 题解 这题就很鬼畜.. 既然每次连边,连出来的边的权值是递增的,所以拿个线段树xjb维护一下就可以做了.那么意 ...

  6. MST最小生成树

    首先,贴上一个很好的讲解贴: http://www.wutianqi.com/?p=3012 HDOJ 1233 还是畅通工程 http://acm.hdu.edu.cn/showproblem.ph ...

  7. [BZOJ1937][SHOI2004]Mst最小生成树(KM算法,最大费用流)

    1937: [Shoi2004]Mst 最小生成树 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 802  Solved: 344[Submit][Sta ...

  8. 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)

    [BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...

  9. [poj1679]The Unique MST(最小生成树)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28207   Accepted: 10073 ...

随机推荐

  1. github管理开发代码流程

    首先.通过github网站新建一个仓库,得到仓库地址 https://github.com/piercalex/a.git 接着回到客户端,打开git shell: //在客户端配置账户信息 git ...

  2. oracle 11g 使用物化视图远程增量刷新数据

    ① 源数据库建立物化视图日志 drop MATERIALIZED VIEW LOG ON ORG_BASEINFO/ CREATE MATERIALIZED VIEW LOG ON ORG_BASEI ...

  3. Linux Ubuntu 能PING IP但不能PING主机域名的解决方法

    ------------------------------------------------------------------------------- vi /etc/nsswitch.con ...

  4. android TV选中时高亮凸显效果

    链接: http://pan.baidu.com/s/1pLjAFQ7 密码: xb8g <ignore_js_op> 360手机助手截图0410_18_02_01.png (335.64 ...

  5. [Laravel] 12 - WEB API : cache implement

    前言 Ref: https://www.imooc.com/video/2873 服务端如何为客户端(app)的首页提供数据接口, 本篇用此作为例子演示接口的实现. 单例模式 一.三大原则 单例实现 ...

  6. windows cmd命令显示UTF8设置

    windows cmd命令显示UTF8设置   在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容.在默认情况 ...

  7. nodejs 单线程 高并发

    nodejs为什么是单线程且支持高并发的脚本语言呢? 1.node的优点:I/O密集型处理(node的I/O请求都是异步的,如:sql查询.文件流操作.http请求……):异步I/O?顾名思义就是异步 ...

  8. Linux内核 设备树操作常用API

    Linux设备树语法详解一文中介绍了设备树的语法,这里主要介绍内核中提供的操作设备树的API,这些API通常都在"include/of.h"中声明. device_node 内核中 ...

  9. Ubuntu下SSH无密码验证配置

    前言 SSH为Secure Shell 的缩写,是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议.越来越多的小伙伴们使用远程登录,而ssh安全性无疑是很高的,那么我们现在来看看如何实现ss ...

  10. python string.py 源码分析 二:capwords

    def capwords(s, sep=None): """capwords(s [,sep]) -> string Split the argument into ...