货车运输(洛谷P1967)(倍增)

传送门

文章目录

  • 题目描述
  • 题目解析
  • 代码

题目描述

在这里插入图片描述

题目解析

本题如果告诉你,城市形成了一棵树,是不是就迎刃而解了呢?
本题的关键就是把稠密图转化为一片森林(就是可能有很多棵树啦)
怎么转化呢?
考虑哪些边是没用的
如果AB已经可以联通且限重很大,再给我一条A到B限重很小的边肯定没有用了
换句话说,我们有用的边就是本图中的一座最大生成森林
(不明白这个词的童鞋可以类比一下最小生成树的概念)

怎么证明呢?
很容易
考虑怎么生成最大森林的:
每次选出未选的权值最大的边,如果两边的点未联通就连上

假设A到B的最好路径有一条边X不在这个森林上
那么这条边的权值肯定大于森林上AB路径的最小值Y(这样森林上的路径才不是最优的)
那么我们建造森林时肯定会使X在Y之前枚举到
而此时AB不连通(因为枚举到Y时还不连通)
那么应该把X加入森林中
和“X不在这个森林上"矛盾
证完啦(自己写的证明,可能有些草率

转化为树上问题后就非常简单
倍增,dfs序,树剖,都可以啦(还有很多做法但我还不会。。。)
联通判断常规并查集就OK了
说起来还是倍增好写
那就写倍增啦

倍增第一次少取了一个min还挂掉了。。。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mid ((l+r)>>1)
#define ls k<<1
#define rs k<<1|1
const int N=2e5+100;
const int M=2e4+100;int n,m,q;
int a,b,c;struct node{int to,nxt,v;
}p[N];
int fi[N],cnt=-1;
void addline(int x,int y,int v){
//	printf("addline:x=%d y=%d v=%d\n",x,y,v);p[++cnt]=(node){y,fi[x],v};fi[x]=cnt;
}int fa[N];
int find(int x){return fa[x]==x ? x : fa[x]=find(fa[x]);}
void merge(int a,int b){int aa=find(a),bb=find(b);fa[aa]=bb;
}int dep[N],f[N],up[N];
void dfs(int x,int ffa){f[x]=ffa;dep[x]=dep[ffa]+1;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==ffa) continue;up[to]=p[i].v;dfs(to,x);}return;
} struct node2{int x,y,v;bool operator < (const node2 o)const {return v>o.v;}
}e[N];struct node3{int pl,mn;
}dp[M][20];
int mi[20];
void solve(){mi[0]=1;for(int i=1;i<=16;i++) mi[i]=mi[i-1]<<1;for(int i=1;i<=n;i++){dp[i][0].pl=f[i];dp[i][0].mn=up[i];
//		printf("ok i=%d k=0 pl=%d mn=%d\n",i,dp[i][0].pl,dp[i][0].mn);}for(int k=1;k<=15;k++){for(int i=1;i<=n;i++){if(dep[i]>=mi[k]){dp[i][k].pl=dp[dp[i][k-1].pl][k-1].pl;dp[i][k].mn=min(dp[i][k-1].mn,dp[dp[i][k-1].pl][k-1].mn);
//				printf("i=%d k=%d pl=%d mn=%d\n",i,k,dp[i][k].pl,dp[i][k].mn);}}}
}int lca(int x,int y){int ans=2e9;if(dep[y]>dep[x]) swap(x,y);for(int k=15;k>=0;k--){if(dep[x]-mi[k]<dep[y]) continue;ans=min(ans,dp[x][k].mn);x=dp[x][k].pl;
//		printf("ok x=%d y=%d ans=%d\n",x,y,ans);}for(int k=15;k>=0;k--){if(mi[k]>dep[x]) continue;if(dp[x][k].pl==dp[y][k].pl) continue;ans=min(ans,dp[x][k].mn);x=dp[x][k].pl;ans=min(ans,dp[y][k].mn);y=dp[y][k].pl;
//		printf("x=%d y=%d ans=%d\n",x,y,ans);}if(x!=y) ans=min(ans,min(dp[y][0].mn,dp[x][0].mn));//这里x和y的dp都要考虑取min,显然不一样啊!!!return ans;
}int main(){memset(fi,-1,sizeof(fi));memset(dep,-1,sizeof(dep));scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=m;i++) scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].v);sort(e+1,e+1+m);for(int i=1;i<=m;i++){int xx=find(e[i].x),yy=find(e[i].y);if(xx==yy) continue;merge(xx,yy);addline(e[i].x,e[i].y,e[i].v);addline(e[i].y,e[i].x,e[i].v);}for(int i=1;i<=n;i++){if(dep[i]==-1){dep[i]=0;dfs(i,0);}}solve();scanf("%d",&q);for(int i=1;i<=q;i++){scanf("%d%d",&a,&b);if(find(a)!=find(b)) printf("-1\n");else printf("%d\n",lca(a,b));}return 0;
}
/*
11 9
1 2 8
1 3 15
1 7 7
2 4 12
3 6 9
3 5 6
8 9 11
8 10 10
10 11 15
100
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core实战项目之CMS 第十一章 开发篇-数据库生成及实体代码生成器开发

上篇给大家从零开始搭建了一个我们的ASP.NET Core CMS系统的开发框架&#xff0c;具体为什么那样设计我也已经在第十篇文章中进行了说明。不过文章发布后很多人都说了这样的分层不是很合理&#xff0c;什么数据库实体应该跟仓储放在一起形成领域对象&#xff0c;什么ViewModel应…

第1节 连通性强连通、割点和桥(一)

文章目录无向图割点、桥、双连通分量Tarjan算法求割点和桥&#xff08;割边&#xff09;代码&#xff1a;边双连通分量 和 点双连通分量代码边双连通分量 和 点双连通分量 的缩点有向图的弱连通与强连通强连通分量Kosaraju算法Tarjan算法代码&#xff1a;无向图割点、桥、双连通…

连通性(相关练习)

文章目录NC20603 [ZJOI2007]最大半连通子图题目&#xff1a;题解&#xff1a;代码&#xff1a;NC50403 嗅探器题目&#xff1a;题解&#xff1a;代码&#xff1a;NC51269 Network of Schools题目&#xff1a;题解&#xff1a;代码&#xff1a;NC106972 Cow Ski Area题目&#x…

ASP.NET Core WebAPI中使用JWT Bearer认证和授权

为什么是 JWT BearerASP.NET Core 在 Microsoft.AspNetCore.Authentication 下实现了一系列认证, 包含 Cookie, JwtBearer, OAuth, OpenIdConnect 等,Cookie 认证是一种比较常用本地认证方式, 它由浏览器自动保存并在发送请求时自动附加到请求头中, 更适用于 MVC 等纯网页系统的…

网络流专题(最大流与费用流)(一)

流量网络 • 想要将一些水从S运到T&#xff0c;必须经过一些水站&#xff0c;链接水站的是管道&#xff0c;每条管道都有它的最大能容纳的水量&#xff0c;求最多S到T能流多少流量。 基本概念 • 这是一个典型的网络流模型。我们先了解网络流的有关定义和概念。 • 若有向图G(…

eShopOnContainers 看微服务 ①:总体概览

一、简介eShopOnContainers是一个简化版的基于.NET Core和Docker等技术开发的面向微服务架构的参考应用。该参考应用是一个简化版的在线商城/电子商务微服务参考示例应用。其包含基于浏览器的Web应用、基于Xamarin的Android、IOS、Windows/UWP 移动应用&#xff0c;以及服务端应…

网络流专题(最大流与费用流)例题总结

文章目录NC 106056 poj1459 Power Network题目大意&#xff1a;题解&#xff1a;NC213817 [网络流24题]最小路径覆盖问题题目&#xff1a;题解&#xff1a;例2&#xff1a;NC213818 [网络流24题]魔术球问题题目&#xff1a;题解&#xff1a;方法2&#xff1a;NC 213820 [网络流…

周期长度和(KMP)

文章目录题目描述解析问题总结代码题目描述 解析 我们可以看到 如果A是B的周期 那么B一定可以写成&#xff1a; A1A2A1 的形式 注意到&#xff1a;A1就是KMP中的公共前后缀 要使A最大&#xff0c;要使A1最短 也就是求最短公共前后缀 这怎么求呢&#xff1f; 我们注意到&#x…

计算几何基础-1

文章目录基本概念点与向量的运算精度问题线段&#xff0c;射线和直线点积&#xff1a;夹角叉积向量的极角旋转一个向量求三角形面积直线交点点到直线距离点在直线上的投影判断两条线段是否相交点与直线的位置关系点是否在直线左侧点是否在直线上点是否在线段上点与多边形的位置…

.net core i上 K8S(四).netcore程序的pod管理,重启策略与健康检查

目录1.pod管理2.重启策略3.健康检查4.进入容器正文上一章我们已经通过yaml文件将.netcore程序跑起来了&#xff0c;但还有一下细节问题可以分享给大家。1.pod管理1.1创建podkubectl create -f netcore-pod.yaml我们创建一个netcore-pod.yaml文件&#xff0c;内容如下&#xff1…

洛谷P2680:运输计划(倍增、二分、树上差分)

传送门 文章目录题目描述解析问题代码题目描述 解析 求最大值的最小值 容易想到二分 然后。。。就没有然后了。。。 看了题解 学会了一个新技能&#xff1a;树上差分 &#xff08;其实学长之前好像讲过。。。&#xff09; 一般的&#xff0c;对于一条A到B的路径&#xff0c;如…

计算几何基础-2

文章目录直线&#xff1a;图形&#xff1a;求垂足求两圆交点直线与圆交点多边形问题判断一个点是否在任意多边形内部Pick定理凸包求点集的凸包水平法&#xff1a;增量法&#xff1a;半平面半平面交求半平面交直线&#xff1a; struct Line{point p,v;Line(){}Line(point _p.po…

eShopOnContainers 看微服务 ②:配置 启动

一、什么是dockerDocker 是一个开源项目&#xff0c;通过把应用程序打包为可移植的、自给自足的容器&#xff08;可以运行在云端或本地&#xff09;的方式&#xff0c;实现应用程序的自动化部署。使用 Docker 的时候&#xff0c;需要创建一个应用或服务&#xff0c;然后把它和它…

判断整除(opj)(动态规划)

解析 与取模结合的动归&#xff0c;正常做即可 问题 眼瞎&#xff01;&#xff01;&#xff01; 这个序列的每个数都必须用到&#xff01;&#xff01;&#xff01; if(f[i-1][j]) f[i][j]1;上面这行就是不对的&#xff01;&#xff01;&#xff01; 头疼 仔细审题 opj的题…

[USACO09FEB]Revamping Trails G

题意&#xff1a; 约翰一共有 N 个牧场.由 MM 条布满尘埃的小径连接。小径可以双向通行。每天早上约翰从牧场 1 出发到牧场 N 去给奶牛检查身体。 通过每条小径都需要消耗一定的时间。约翰打算升级其中 K 条小径&#xff0c;使之成为高速公路。在高速公路上的通行几乎是瞬间完…

NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成...

本篇内容属于非实用性&#xff08;拿来即用&#xff09;介绍&#xff0c;如对框架设计没兴趣的朋友&#xff0c;请略过。 快一个月没有写博文了&#xff0c;最近忙着两件事;一&#xff1a;阅读刘墉先生的《说话的魅力》&#xff0c;以一种微妙的&#xff0c;你我大家都会经常遇…

花店橱窗布置(洛谷P1854)(动态规划)

传送门 文章目录解析问题代码解析 一道很正常的动态规划 dp[i][j]表示到第j个花瓶放了第j朵花的dp最优值 注意&#xff1a;是严格使第i朵放在j瓶 找到最优解递归输出即可 问题 又是初始化的问题&#xff01;&#xff01;&#xff01; 一开始把dp赋值成负无穷时落掉了j0的一行…

P4009 汽车加油行驶问题

题目描述&#xff1a; 题解&#xff1a; 看了很多题解&#xff0c;无论什么解法都绕不开分层图 在本题中加满油的车每次可以移动K步&#xff0c;那么我们就可以建立一个K1层的分层图&#xff0c;表示汽车油量k的状态&#xff08;油量0…k&#xff09;&#xff0c;然后根据题目…

.net core i上 K8S(五).netcore程序的hostip模式

正文上一章讲了pod的管理&#xff0c;今天再分享一个pod的访问方式1.Pod的HostIP模式Pod的HostIP模式&#xff0c;可以通过宿主机访问pod内的服务&#xff0c;创建yaml文件如下apiVersion: v1 kind: Pod metadata: name: netcore-podlabels:app: netcorepod spec:containers: …

状态压缩:枚举子集(最优组队)(ybtoj)(动态规划)

解析 很裸的状压dp 但是直接暴力的话状态2n,枚举2n 乘在一起会T诶 怎么办呢&#xff1f; 使用下面这个循环&#xff0c;就可以保证只会枚举当前状态s的子集 for(int i(s-1)&s;i;i(i-1)&s){........ }证明 举举例子就挺明显了 为什么不重不漏呢&#xff1f; 首先i肯…