NOIP2013 货车运输 LCA倍增+最大生成树
- #include <cstdio>
- #include <iostream>
- #include <ctime>
- #include <vector>
- #include <cmath>
- #include <map>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- typedef long long LL;
- const int N=1e4+;
- const int INF=0x3f3f3f3f;
- struct Edge{
- int u,v,w,next;
- bool operator<(const Edge &rhs)const{
- return w>rhs.w;
- }
- }o[N*],edge[N<<];
- int fa[N][],fat[N],head[N],tot,p[N][];
- void add(int u,int v,int w){
- edge[tot].w=w;
- edge[tot].v=v;
- edge[tot].next=head[u];
- head[u]=tot++;
- }
- int find(int x){
- if(x==fat[x])return x;
- return fat[x]=find(fat[x]);
- }
- int d[N];
- void dfs(int u,int f){
- d[u]=d[f]+;
- fa[u][]=f;
- for(int i=head[u];~i;i=edge[i].next){
- int v=edge[i].v;
- if(v==f)continue;
- dfs(v,u);
- p[v][]=edge[i].w;
- }
- }
- int lca(int u,int v){
- int ans=INF;
- if(d[u]<d[v])swap(u,v);
- for(int t=d[u]-d[v],i=;t;t>>=,++i)
- if(t&)ans=min(p[u][i],ans),u=fa[u][i];
- if(u==v)return ans;
- for(int i=;i>=;--i){
- if(fa[u][i]!=-&&fa[u][i]!=fa[v][i]){
- ans=min(ans,p[u][i]);
- ans=min(ans,p[v][i]);
- u=fa[u][i],v=fa[v][i];
- }
- }
- ans=min(ans,p[u][]);
- ans=min(ans,p[v][]);
- return ans;
- }
- int main()
- {
- int n,m;
- scanf("%d%d",&n,&m);
- for(int i=;i<=m;++i){
- scanf("%d%d%d",&o[i].u,&o[i].v,&o[i].w);
- }
- sort(o+,o++m);
- for(int i=;i<=n;++i)fat[i]=i,head[i]=-;
- int cnt=;
- for(int i=;i<=m;++i){
- int x=find(o[i].u),y=find(o[i].v);
- if(x!=y){
- fat[y]=x;
- ++cnt;
- add(o[i].u,o[i].v,o[i].w);
- add(o[i].v,o[i].u,o[i].w);
- if(cnt>=n-)break;
- }
- }
- memset(p,INF,sizeof(p));
- memset(fa,-,sizeof(fa));
- for(int i=;i<=n;++i){
- if(fat[i]==i){
- dfs(i,);
- fa[i][]=-;
- }
- }
- for(int j=;(<<j)<=n;++j){
- for(int i=;i<=n;++i){
- if(fa[i][j-]!=-)
- {
- fa[i][j]=fa[fa[i][j-]][j-];
- p[i][j]=min(p[i][j-],p[fa[i][j-]][j-]);
- }
- }
- }
- int q;
- scanf("%d",&q);
- while(q--){
- int u,v;
- scanf("%d%d",&u,&v);
- if(find(u)!=find(v)){
- printf("-1\n");
- continue;
- }
- printf("%d\n",lca(u,v));
- }
- return ;
- }
分析:
看这个就好http://hzwer.com/1344.html 仰慕黄学长
然后刚开始我没想写倍增,想写树剖的,后来一看,树剖勉强应该多一个log,而且代码长
所以倍增大法好
NOIP2013 货车运输 LCA倍增+最大生成树的更多相关文章
- NOIP2013货车运输[lca&&kruskal]
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- NOIP2013 货车运输(最大生成树,倍增)
NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...
- [Luogu 1967] NOIP2013 货车运输
[Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...
- NOIP2013 货车运输 (最大生成树+树上倍增LCA)
死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...
- NOIP2013 货车运输
3.货车运输 (truck.cpp/c/pas) [问题描述] A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货 ...
- Codevs3278[NOIP2013]货车运输
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 ...
- 【洛谷P1967】[NOIP2013]货车运输
货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. #include<iostrea ...
- noip2013货车运输
P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...
- P1967 货车运输(倍增LCA,生成树)
题目链接: https://www.luogu.org/problemnew/show/P1967 题目描述 A国有n座城市,编号从 1到n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制, ...
随机推荐
- C/C++代码检视要点
4.1.1 C/C++代码检视要点 代码检视技能属于开发人员的基本功,能够很大程度地反应出开发人员的能力水平,前面4.4.1节已经讲过提高评审检视的方法.下面以实际的C/C++语言方面的代 ...
- 省市选择(基于zepto.js)
效果如下: <div class="clList overflow-h mt75"> <select class="pull-left cl-35 se ...
- log4net 总结
说实话,我并不是太想写这篇文章,因为我承诺过要完成博客园的部分功能,所以一直都在积极的利用下班时间来完善这个系统, 但是我又不想让看我源代码的朋友不知道我写的代码是什么意思,所以我还是单独写一个文章, ...
- CSS3 animation-fill-mode 属性
现在专注于移动端开发项目,对于动画这个点是非常重要的,每当我遇到一个新的知识点,我就会和大家一起分享 animation-fill-mode :把物体动画地从一个地方移动到另一个地方,并让它停留在那里 ...
- Ubuntu下安装php调试工具xdebug
安装xdebug: sudo apt-get install php-pear sudo apt-get install php5-dev pecl install xdebug 创建配置文件: /x ...
- platform_driver_register()--如何match之后调用probe
int platform_driver_register(struct platform_driver *drv) { drv->driver.bus = &platform_bus_t ...
- Codeforces Round #344 (Div. 2) C. Report
Report 题意:给长度为n的序列,操作次数为m:n and m (1 ≤ n, m ≤ 200 000) ,操作分为t r,当t = 1时表示将[1,r]序列按非递减排序,t = 2时表示将序列[ ...
- ubuntu系统软件
1.办公软件:wps 2.浏览器:firefox,opera 3.思维导图:xmind 如果您有好的软件,请推荐给我,谢谢!
- Codeforces Round #327 div2
Problem_A(591A): 题意: 有一段长度为l的路,两个人分别在两个端点,1, l. 现在已知每个人的速度为p,q. 求第一个人(初始位置在1)在他们第二次相遇的时候的位置. 当他们相遇的时 ...
- sjtu1590 强迫症
Description BS96发布了一套有\(m\)个band柄绘的新badge,kuma先生想要拿到04的badge于是进行了抽抽抽. kuma先生一共抽了\(n\)个badge.他把所有的bad ...