AT2134 Zigzag MST 最小生成树
正解:最小生成树
解题报告:
然后这题,首先可以发现这神奇的连边方式真是令人头大,,,显然要考虑转化掉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 最小生成树的更多相关文章
- 【题解】 AT2134 Zigzag MST
[题解]AT2134 Zigzag MST 一道MST好题 \(Anson\)有云: 要么是减少边的数量. 要么是改变连接边的方式. 那么如何减少边的数量呢?很简单,把所有不可能对答案产生贡献的边去掉 ...
- 题解 [AT2134] Zigzag MST
题面 解析 我们先考虑一下加一条边(x,y,z)会成什么亚子: (还有很多边不画了...) 然后我们把这个图单独拿出来: 我们可以发现,对于最小生成树的贡献, 它是等价于下面这张图的(因为连通性一样) ...
- 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$(画 ...
- AT2134 Zigzag MST
题面 题解 这个题目主要是连边很奇怪,但是我们可以发现一个性质:权值是递增的. 于是像下图的连边:(加边方式为\((A_1, B_1, 1)\)) 其实可以等价于如下连边: 于是我们将其变成了在环上连 ...
- 【AtCoder2134】ZigZag MST(最小生成树)
[AtCoder2134]ZigZag MST(最小生成树) 题面 洛谷 AtCoder 题解 这题就很鬼畜.. 既然每次连边,连出来的边的权值是递增的,所以拿个线段树xjb维护一下就可以做了.那么意 ...
- 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.接下来的 ...
- [poj1679]The Unique MST(最小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 28207 Accepted: 10073 ...
随机推荐
- Java编程的逻辑 (78) - 线程池
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- Foxpro数据库连接错误解决方法--【VFP DBF文件不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器】
直接访问vfp dbf文件时报错: 错误描述: 'd:\vfpData\test.dbf'不是一个有效的路径. 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器. 解决办法:Data Sour ...
- 什么是对象:EVERYTHING IS OBJECT(万物皆对象)
所有的事物都有两个方面: 有什么(属性):用来描述对象. 能够做什么(方法):告诉外界对象有那些功能. 后者以前者为基础. 大的对象的属性也可以是一个对象.
- Python套接字编程(1)——socket模块与套接字编程
在Python网络编程系列,我们主要学习以下内容: 1. socket模块与基本套接字编程 2. socket模块的其他网络编程功能 3. SocketServer模块与简单并发服务器 4. 异步编程 ...
- Win7/Win10多用户同时使用远程桌面
Win7/Win10正常情况下是不允许多用户同时远程的,即一个用户远程进来会把另一个用户踢掉,需要破解. Win7:安装UniversalTermsrvPatch-x64.exe,见https://p ...
- Python中类的特殊变量
特殊变量 类似__xx,以双下划线开头的实例变量名,就变成了一个私有变量(private),只有内部可以访问,外部不能访问: 类似__xx__,以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变 ...
- 5 -- Hibernate的基本用法 --5 1 持久化类的要求
1. 提供一个无参数的构造器:所有的持久化类都应该提供一个无参数的构造器,这个构造器可以不采用public访问控制符.只要提供了无参数的构造器,Hibernate就可以使用Constructor.n ...
- Mac 环境 Vue 开发 CPU 占用率高 问题
Mac开发Vue应用时,发现CPU风扇转的老高. htop查看一下: 问题找到了,就是这个dev-server.js,node起的进程. 然后就是 dtruss -p 1230(进程ID) 命名跟踪一 ...
- linux dd指令
ghost和g4l 安装操作系统,速度太慢,整个过程太冗长乏味了. 安装过程中,需要回答若干问题,系统需要安装无数个软件,创建和写入无数的文件.因为涉及到大量的文件定位和读写,速度一定是快不起来的. ...
- VC++、Win32 SDK、MFC的区别
这是一个初进行开发人员都可能遇到过的概念不清的问题,自己当年也同样有过误解,做技术我感觉一定要专,但是,不代表毫不关心相关的知识,至少概念层次上要知道,所以,这里还是再把这些内容纪录下来,好记性不如烂 ...