BZOJ3424 : Poi2013 Multidrink

详细做法以及证明请看论文《Hamiltonian paths in the square of a tree》

首先将1到n的路径提取出来,作为主干。

定义毛毛虫为去掉叶子之后只有一条单链的树,定义non-trivial的毛毛虫为单链非空的毛毛虫。

对于主干上每个点,计算它的非主干部分是否是毛毛虫,如果某个部分不是毛毛虫,那么肯定无解。

将主干上每个点划分为两类:

A:non-trivial的毛毛虫不超过1个。

B:non-trivial的毛毛虫恰有两个。

同时定义一个点是free的当且仅当它是单点。

如下图:

判断一下是否每对相邻的B类点中间都有free点,且所有B类点前后都有free点,如果没有,那么也无解。

现在必然存在一条以1为起点,且依次遍历完主干上每个点及其子树的2H-哈密顿路径。

对于1,如果它是free的,那么方案显然,否则从1出去的点必定是它子树里离它距离只有1的点。

然后一个一个构造,如果上一个点是第二层的点,那么这一部分起点必须为主干上的点,否则起点选第二层的点显然更优。

对于一个毛毛虫,可以直接构造出2H-哈密顿环,从中断开某条路径得到合法的方案。

如下图:

但是如果一个点是B类点,这个时候是不能如此构造的,只能是起点和终点都是第二层的点,而且起点优先考虑叶子节点,这个时候就又可以按之前的方法构造。

最后再检验一下终点是否为n即可,时间复杂度$O(n)$。

 

#include<cstdio>
#include<cstdlib>
#define N 500010
int n,i,j,x,y,S,T,d[N],g[N],v[N<<1],nxt[N<<1],ed,pre[N],sub[N];
int f[N],G[N],V[N],NXT[N];
int m,a[N],ans,fin[N],cnt,q[N],b[N<<1],tot;bool vip[N],fr[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
void NO(){puts("BRAK");std::exit(0);}
inline void swap(int&a,int&b){int c=a;a=b;b=c;}
inline void reserve(int*a,int n){for(int i=1,j=n;i<j;i++,j--)swap(a[i],a[j]);}
inline void add(int x,int y){d[x]++;v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline void ADD(int x,int y){f[y]=x;V[++ed]=y;NXT[ed]=G[x];G[x]=ed;}
void dfs(int x,int y){
  pre[x]=y;
  for(int i=g[x];i;i=nxt[i])if(v[i]!=y)dfs(v[i],x);
}
bool spine(int x,int y){
  int t=0;
  for(int i=g[x];i;i=nxt[i])if(v[i]!=y&&d[v[i]]>1){
    if(!spine(v[i],x))return 0;
    if(t++)return 0;
  }
  return 1;
}
inline int any_secondary_node(int x){
  for(int i=g[x];i;i=nxt[i])if(!vip[v[i]])return v[i];
}
inline int a_secondary_node_preferably_leaf(int x){
  for(int i=g[x];i;i=nxt[i])if(!vip[v[i]]&&d[v[i]]==1)return v[i];
  return any_secondary_node(x);
}
inline int another_secondary_node(int x,int y){
  for(int i=g[x];i;i=nxt[i])if(!vip[v[i]]&&v[i]!=y)return v[i];
}
void findspine(int x,int y){
  q[++cnt]=x;
  for(int i=g[x];i;i=nxt[i])if(v[i]!=y)if(d[v[i]]==1)ADD(x,v[i]);else findspine(v[i],x);
}
inline int left(int x){return x==1?tot:x-1;}
inline int right(int x){return x==tot?1:x+1;}
inline void extend(int x,int a=0,int b=0){
  for(int i=G[x];i;i=NXT[i])if(V[i]!=a&&V[i]!=b)fin[++ans]=V[i];
}
inline void path_caterpillar(int x,int S,int T){
  fin[++ans]=S;
  if(S==T)return;
  int i,j,A,B;
  q[cnt=1]=x;
  for(i=g[x];i;i=nxt[i])if(!vip[v[i]]){
    if(d[v[i]]==1)ADD(x,v[i]);
    else{
      if(cnt>1)reserve(q,cnt);
      findspine(v[i],x);
    }
  }
  for(i=1;i<=cnt;i++){
    b[i]=i&1?q[i]:-q[i];
    b[cnt+cnt-i+1]=-b[i];
  }
  for(tot=0,i=1;i<=cnt+cnt;i++){
    if(b[i]<0)if(!G[-b[i]])continue;
    b[++tot]=b[i];
  }
  if(d[S]>1)A=S;else A=-f[S];
  if(d[T]>1)B=T;else B=-f[T];
  for(i=1;i<=tot;i++)if(b[i]==A)break;
  if(A<0)extend(-A,S,T);
  if(b[left(i)]==B)
    for(j=right(i);b[j]!=B;j=right(j))if(b[j]>0)fin[++ans]=b[j];else extend(-b[j]);
  else
    for(j=left(i);b[j]!=B;j=left(j))if(b[j]>0)fin[++ans]=b[j];else extend(-b[j]);
  if(B<0&&A!=B)extend(-B,S,T);
  fin[++ans]=T;
}
int main(){
  read(n);
  for(i=1;i<n;i++)read(x),read(y),add(x,y),add(y,x);
  dfs(n,ed=0);
  for(i=1;i!=n;i=pre[i])a[++m]=i;a[++m]=i;
  for(i=1;i<=m;i++)vip[a[i]]=1;
  for(i=1;i<=m;i++){
    x=a[i];fr[x]=1;
    for(j=g[x];j;j=nxt[j]){
      y=v[j];
      if(vip[y])continue;
      fr[x]=0;
      if(d[y]==1)continue;
      sub[x]++;
      if(sub[x]>2)NO();
      if(!spine(y,x))NO();
    }
  }
  for(i=1,j=0;i<=m;i++){
    x=a[i];
    if(fr[x])j=1;
    else if(sub[x]==2){
      if(j!=1)NO();
      j=2;
    }
  }
  if(j==2)NO();
  S=a[1];
  if(fr[a[1]])T=a[1];else T=any_secondary_node(a[1]);
  path_caterpillar(a[1],S,T);
  for(i=2;i<=m;i++){
    x=a[i];
    if(fr[x])S=T=x;
    else if(!vip[T]){
      S=x;
      T=a_secondary_node_preferably_leaf(x);
    }else{
      S=a_secondary_node_preferably_leaf(x);
      T=sub[x]<2?x:another_secondary_node(x,S);
    }
    path_caterpillar(x,S,T);
  }
  if(fin[n]!=n)NO();
  for(i=1;i<=n;i++)printf("%d\n",fin[i]);
  return 0;
}

  

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值