当前位置: 首页 > news >正文

【NOIP】提高组2013 货车运输

【算法】最大生成树+LCA(倍增)

【题解】两点间选择一条路径最小值最大的路径,这条路径一定在最大生成树上,因为最大生成树就是从边权最大的边开始加的

先求原图的最大生成树(森林),重新构图,然后用一个超级根连向每棵树的根。

对于每个询问,在树上跑z=LCA(x,y),答案就是x到z,z到y路上的最小值。

这个最小值可以在LCA(倍增)的过程中顺便维护(ms数组),和祖先(倍增)数组的维护方式类似。

ms[e[x].to][0]=e[i].w;

ms[x][i]=min(ms[x][i-1],ms[f[x][i-1]][i-1]);

求ans的时候,x,y每次向上推进都求一次ans=min(ans,...),具体可以看程序。

【注意】(只是提醒自己T_T)

1.每次要更新x,y的位置前先求ans。

2.无向边建两条,数组要开大,而且后面求生成树的时候要用建边总数而不是原边总数m!!!

3.超级根用0容易出错,用比maxn大的数字即可。

4.重新构图的新边表和旧边表各种变量注意区分

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f,maxn=10010;
bool ok[maxn];
struct cyc{int next,from,to,w;}eo[150010],e[150010];
int cnt,tot,head[maxn],heads[maxn],fa[maxn],f[maxn][16],ms[maxn][16],vis[maxn],deep[maxn],n,m,q;
void insert(int u,int v,int w)
{cnt++;eo[cnt].from=u;eo[cnt].to=v;eo[cnt].w=w;eo[cnt].next=heads[u];heads[u]=cnt;}
void ins(int u,int v,int w)
{tot++;e[tot].from=u;e[tot].to=v;e[tot].w=w;e[tot].next=head[u];head[u]=tot;}
int getfa(int x)
{return fa[x]==x?x:(fa[x]=getfa(fa[x]));}
bool cmp(cyc a,cyc b)
{return a.w>b.w;}
void dfs(int x)
{
    vis[x]=1;
    for(int i=1;(1<<i)<=deep[x];i++)
     f[x][i]=f[f[x][i-1]][i-1],
     ms[x][i]=min(ms[x][i-1],ms[f[x][i-1]][i-1]);
//     printf("head[%d]=%d",x,head[x]);
    for(int i=head[x];i;i=e[i].next){//printf("i=%d\n",i);
     if(!vis[e[i].to])
      {
          int now=e[i].to;
          deep[now]=deep[x]+1;
          f[now][0]=x;
          ms[now][0]=e[i].w;
          dfs(now);
      }}
}
int lca(int x,int y)
{
    int ans=inf;
    if(deep[x]<deep[y])swap(x,y);
    int d=deep[x]-deep[y];
    for(int i=0;(1<<i)<=d;i++)
     if((1<<i)&d)ans=min(ans,ms[x][i]),x=f[x][i];
//    printf("lca=%d\n",x);
    if(x==y)return ans;
    for(int i=15;i>=0;i--)
     if(f[x][i]!=f[y][i])
      ans=min(ans,min(ms[x][i],ms[y][i])),
      x=f[x][i],y=f[y][i];//printf("lca=%d\n",f[x][0]);
    if(f[x][0]==10010)return -1;
    return (ans=min(ans,min(ms[x][0],ms[y][0])));
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
     {
         int u,v,w;
         scanf("%d%d%d",&u,&v,&w);
         insert(u,v,w);
         insert(v,u,w);
     }
    sort(eo+1,eo+cnt+1,cmp);
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1;i<=cnt;i++)
     {
         int u=eo[i].from,v=eo[i].to;
    //     printf("%d %d fa[5]=%d\n",u,v,fa[5]);
         if(getfa(u)!=getfa(v))
          {
              fa[fa[u]]=fa[v];
//              printf("[]%d %d\n",u,v);
              ins(u,v,eo[i].w);
              ins(v,u,eo[i].w);
          }
     }
    for(int i=1;i<=n;i++)
     if(!ok[getfa(i)])ok[fa[i]]=1,ins(10010,fa[i],inf);
//    for(int i=1;i<=tot;i++)printf("[]%d %d %d\n",e[i].from,e[i].to,e[i].w);
    dfs(10010);
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
     {
         int x,y;
         scanf("%d%d",&x,&y);
         int ans=lca(x,y);
         if(ans==-1)printf("-1\n");
         else printf("%d\n",ans);
     }
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/5766677.html

相关文章:

  • AngularJS 用 Interceptors 来统一处理 HTTP 请求和响应
  • Ubuntu16.04 安装wine下的QQ
  • 1-2 ARM概况
  • 大数据美食——寻找地图上的美味
  • 使用python+hadoop-streaming编写hadoop处理程序
  • php ci框架整合银盛支付
  • SQL Server编程(06)触发器
  • 关于写东西
  • 1164 统计数字
  • 大神的Blog挂了,从Bing快照里复制过来的备份
  • linux内核值shmmax问题
  • 一行神奇的javascript代码
  • Mybatis初体验
  • JSP_内置对象_out
  • ubuntu desktop解决系统启动后网络没有主动连接
  • Bytom交易说明(账户管理模式)
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • gf框架之分页模块(五) - 自定义分页
  • HTTP中的ETag在移动客户端的应用
  • JavaScript HTML DOM
  • js算法-归并排序(merge_sort)
  • mongo索引构建
  • Mysql数据库的条件查询语句
  • PHP变量
  • Ruby 2.x 源代码分析:扩展 概述
  • Webpack 4 学习01(基础配置)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从零开始在ubuntu上搭建node开发环境
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 欢迎参加第二届中国游戏开发者大会
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 基于遗传算法的优化问题求解
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 配置 PM2 实现代码自动发布
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 鱼骨图 - 如何绘制?
  • 终端用户监控:真实用户监控还是模拟监控?
  • 最近的计划
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #13 yum、编译安装与sed命令的使用
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (九)One-Wire总线-DS18B20
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)VirtualBox安装增强功能
  • (正则)提取页面里的img标签
  • (转) Android中ViewStub组件使用
  • (转)shell调试方法
  • .net mvc 获取url中controller和action
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net反混淆脱壳工具de4dot的使用
  • .Net环境下的缓存技术介绍
  • .NET开发不可不知、不可不用的辅助类(一)