【题解】AT2134 Zigzag MST

一道MST好题

\(Anson\)有云:

  • 要么是减少边的数量。
  • 要么是改变连接边的方式。

那么如何减少边的数量呢?很简单,把所有不可能对答案产生贡献的边去掉也就是不加,这样就可以减少边的数量了。

怎么改变边的连接方式?很简单,考虑这样子的情况\(\ (1->2),(2->3)\)。此时我们连接一个\((1->3)\)就好了,类比向量?,确实。

那么这一题怎么考虑呢??

发现没有,\((7->14)\)和\((14->8)\)有一组边,我们直接可以连接\((7->8)\),就变成递推了。

设置\(f(x)\)是编号\(x\)点从逆时针方向走过来的最短距离。

考虑初始条件,对于三元组\((a,b,c) , f(a)=c+1,f(b)=c+2\),这样子这只初始条件到时候就只要递推就好了,转移就是\(f(x)=f(x-1)+2 , x\)在\(\mod n\)下。取Min就好了

#include<bits/stdc++.h>
#define int ll
using namespace std;typedef long long ll;
#define DRP(t,a,b) for(register int t=(a),edd=(b);t>=edd;--t)
#define RP(t,a,b) for(register int t=(a),edd=(b);t<=edd;++t)
#define ERP(t,a) for(register int t=head[a];t;t=e[t].nx)
#define midd register int mid=(l+r)>>1
#define TMP template < class ccf >
#define lef l,mid,pos<<1
#define rgt mid+1,r,pos<<1|1
#define pushup(pos) (seg[pos]=seg[pos<<1]+seg[pos<<1|1])
TMP inline ccf qr(ccf b){
register char c=getchar();register int q=1;register ccf x=0;
while(c<48||c>57)q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)x=x*10+c-48,c=getchar();
return q==-1?-x:x;}
TMP inline ccf Max(ccf a,ccf b){return a<b?b:a;}
TMP inline ccf Min(ccf a,ccf b){return a<b?a:b;}
TMP inline ccf Max(ccf a,ccf b,ccf c){return Max(a,Max(b,c));}
TMP inline ccf Min(ccf a,ccf b,ccf c){return Min(a,Min(b,c));}
TMP inline ccf READ(ccf* _arr,int _n){RP(t,1,_n)_arr[t]=qr((ccf)1);}
//----------------------template&IO---------------------------
const int maxn=200005;
struct E{
int fr,to,w;
inline bool operator < (E a){return w<a.w;}
}e[maxn<<1];
int cnt;
int r[maxn];
inline void add(int fr,int to,int w){
e[++cnt]=(E){fr,to,w};
}
inline int q(int x){
register int t=x,i=x,temp;
while(r[t]!=t) t=r[t];temp=t;
while(r[i]!=i) {temp=r[i];r[i]=t;i=temp;}
return t;
} inline bool in(int x,int y){return not(q(x)^q(y));}
inline void j(int x,int y){r[q(x)]=q(y);} int f[maxn];
int n,m;
signed main(){
n=qr(1LL);m=qr(1LL);
RP(t,0,n) r[t]=t;
register int t1,t2,t3;
RP(t,0,n+1) f[t]=1LL<<50;
RP(t,1,m){
t1=qr(1);
t2=qr(1);
t3=qr(1);
add(t1,t2,t3);
f[t1]=Min(f[t1],t3+1LL);
f[t2]=Min(f[t2],t3+2LL);
}
RP(t0,1,2) RP(t,0,n) f[t%n]=Min(f[t%n],f[(t-1+n)%n]+2LL);
RP(t,0,n) add(t%n,(t+1)%n,f[t%n]);
sort(e+1,e+cnt+1);ll ret=0;
RP(t,1,cnt){
if(not in(e[t].fr,e[t].to)){
ret+=(ll)e[t].w;
j(e[t].fr,e[t].to);
}
}
cout<<ret<<endl;
return 0;
}

最新文章

  1. ABP文档翻译--值对象
  2. Yii2 使用a标签发送post请求
  3. Maven依赖版本冲突的分析及解决小结
  4. mysql中,主键与普通索引
  5. ShellExecuteA()&amp;MessageBoxA()
  6. 【转】HADOOP HDFS BALANCER介绍及经验总结
  7. Android bindservice使用
  8. vsftpd 权限设置
  9. awk的思维导图
  10. 自己主动更新--下载apk以及提示对话框的实现(3)
  11. PHP自学之路-----javascript基础入门
  12. leetcode解析回文子串拆分
  13. 循环checked表单 元素
  14. 【由浅入深理解java集合】(四)——集合 Queue
  15. echarts4.0折线图让某个点闪烁
  16. 洛谷 P1032 子串变换
  17. 翻译下 golang package time
  18. 如何用conda安装软件|处理conda安装工具的动态库问题
  19. Linux串口设备树硬件、软件流控设置
  20. Mysql数据库 的库表简易操作

热门文章

  1. CSS:水平居中与垂直居中
  2. 牛客网暑期ACM多校训练营 记录
  3. 【Kafka】《Kafka权威指南》——写数据
  4. 微信工作汇报系统2——IOS原型设计
  5. MySQL Workbench关键字转成小写设置
  6. asp.net站点从2003服务器迁移到2008服务器出现定义了重复的“system.web.extensions/scripting/scriptResourceHandler”节的问题解决
  7. Define Custom Data Filter Using Pre-Query Trigger In Oracle Forms
  8. 【GLSL教程】(五)卡通着色 【转】
  9. Web Service之Soap请求响应内容中文编码解密
  10. 强大易用的日期和时间库 Joda Time