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

P1967 货车运输

P1967 货车运输

思路:

    将边权从大到小排序,然后建立最大生成树,在新图上求两个点的lca即可

  1 #include <cstdio>
  2 #include <iostream>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <cmath>
  6 #include <cctype>
  7 using namespace std;
  8 
  9 #define inf 0x7f7f7f7f
 10 #define LL long long
 11 #define res register int
 12 inline int read()
 13 {
 14     int x(0),f(1); char ch;
 15     while(!isdigit(ch=getchar())) if(ch=='-') f=-1;
 16     while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
 17     return f*x;
 18 }
 19 int n,m;
 20 const int N=500000+5;
 21 int head[N],nxt[N<<1],ver[N<<1],edge[N<<1],tot;
 22 struct E{
 23     int u,v,w;
 24 }e[N];
 25 int vis[N],fa[N],d[N];
 26 int f[N][22],dis[N][22];
 27 
 28 //inline int min(int a,int b){return a<b?a:b;}
 29 inline bool cmp(E a,E b) {return a.w>b.w;}
 30 inline void add(int x,int y,int z) {
 31     ver[++tot]=y; nxt[tot]=head[x]; head[x]=tot; edge[tot]=z;
 32     ver[++tot]=x; nxt[tot]=head[y]; head[y]=tot; edge[tot]=z;
 33 }    
 34 //inline void swap(int &x,int &y) {int tmp=x; x=y; y=tmp;}
 35 inline int get(int x) {
 36     if(x==fa[x]) return x; return fa[x]=get(fa[x]);
 37 }
 38 
 39 inline void Kruskal()
 40 {
 41     sort(e+1,e+m+1,cmp);
 42     for(res i=1 ; i<=n ; i++) fa[i]=i;
 43     for(res i=1 ; i<=m ; i++)
 44     {
 45         int x=get(e[i].u),y=get(e[i].v),z=e[i].w;
 46         if(x==y) continue;
 47         fa[x]=y;
 48         add(x,y,z);
 49     }
 50 }
 51 
 52 void dfs(int x)
 53 {
 54     vis[x]=1;
 55     for(res i(head[x]) ; i ; i=nxt[i])
 56     {
 57         int y=ver[i]; 
 58         if(vis[y]) continue;
 59         f[y][0]=x; dis[y][0]=edge[i];
 60 //        printf("dis %d",dis[y][0]);
 61         d[y]=d[x]+1;    dfs(y);
 62     }
 63 }
 64 
 65 inline int lca(int x,int y)
 66 {
 67     if(get(x)!=get(y)) return -1;
 68     if(d[x]<d[y]) swap(x,y);
 69     int ans=inf;
 70     for(res i=20 ; i>=0 ; i--)
 71         if(d[f[x][i]]>=d[y])
 72         {
 73             ans=min(ans,dis[x][i]);    
 74             x=f[x][i];
 75         } 
 76     if(x==y) return ans;
 77     for(res i=20 ; i>=0 ; i--)
 78         if(f[x][i]!=f[y][i])
 79         {
 80             ans=min(ans,dis[x][i]);
 81             ans=min(ans,dis[y][i]);
 82             x=f[x][i],y=f[y][i];
 83         }
 84     ans=min(ans,dis[x][0]);
 85     ans=min(ans,dis[y][0]);
 86     return ans;
 87 }
 88 
 89 
 90 int main()
 91 {
 92 //    freopen("in.txt","r",stdin);
 93     n=read(); m=read();
 94     for(res i=1 ; i<=m ; i++) 
 95         e[i].u=read(), e[i].v=read(),e[i].w=read();
 96     Kruskal();
 97     for(res i=1 ; i<=n ; i++)
 98     {
 99         if(!vis[i]) 
100         {
101             d[i]=1; dfs(i);
102             f[i][0]=i; dis[i][0]=inf;    
103         }
104     }
105     //注意顺序
106     for(int i=1; i<=20; i++)
107         for(int j=1; j<=n; j++){
108             f[j][i]=f[f[j][i-1]][i-1]; 
109             dis[j][i]=min(dis[j][i-1], dis[f[j][i-1]][i-1]);
110         }
111     int q=read();
112     for(res i=1 ; i<=q ; i++)
113     {
114         int x=read(),y=read();
115         printf("%d\n",lca(x,y));
116     }
117     return 0;
118 }
View Code

 

转载于:https://www.cnblogs.com/wmq12138/p/10380953.html

相关文章:

  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • Spring实践--spring事务:基础知识
  • 开工大吉,推荐几个Vim神级插件
  • nohup命令详解
  • Java 面向对象基础
  • CSS实用技巧
  • SQL笔记
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 剑指offer-数值的整数方
  • 阿里研究院入选中国企业智库系统影响力榜
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 开工的欲望 | AI Studio悄然上线新功能,用你的模型生成在线预测服务
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 集群概念
  • 周末时间学习Linux
  • 【RocksDB】TransactionDB源码分析
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • JavaScript-Array类型
  • JAVA并发编程--1.基础概念
  • JS题目及答案整理
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • mockjs让前端开发独立于后端
  • PaddlePaddle-GitHub的正确打开姿势
  • PHP CLI应用的调试原理
  • php的插入排序,通过双层for循环
  • python 装饰器(一)
  • swift基础之_对象 实例方法 对象方法。
  • 笨办法学C 练习34:动态数组
  • 程序员最讨厌的9句话,你可有补充?
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 开源SQL-on-Hadoop系统一览
  • 两列自适应布局方案整理
  • 前端
  • 异步
  • 用Python写一份独特的元宵节祝福
  • 怎样选择前端框架
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (11)MSP430F5529 定时器B
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (附源码)php投票系统 毕业设计 121500
  • (汇总)os模块以及shutil模块对文件的操作
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (算法)前K大的和
  • (一)Java算法:二分查找
  • (转)EOS中账户、钱包和密钥的关系
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net Signalr 使用笔记
  • .Net各种迷惑命名解释
  • .NET运行机制
  • .net专家(高海东的专栏)
  • @ConditionalOnProperty注解使用说明