洛谷P1967 货车运输 [noip2013] 图论
正解:kruskal+LCA
解题报告:
哇真实心痛了...明明都没多少时间了我居然耗了一个上午+一个中午在上面?哭死辽我QAQ果然菜是原罪QAQ
然后这题,我先港下60pts做法趴?话说其实我觉得我考场上能想出60pts就很不错了我就心满意足了欸qwq
大概就是,我记得之前做过一个图论的题目叫什么,comfort trip?完了忘了名字了...好像是零几年的一道省选题趴,大意是说,要从A地到B地.然后问你最长路和最短路的比值最小是多少
然后这题当初是学长专题分享的时候港的,因为感觉方法太有趣太妙了我就落实了所以还有点印象,这题大概就是,贪心地从大往小选,用个并查集维护一下,每次确定一个最大值然后就一路往小的选,就一直选一直选选到AB是连起来的为止
所以这题我就是用的一样的思想,我就直接写了个从大往小选这么一路选下去然后每次加一条边就搞一下看有没有连起来了的俩点,有就存下他们的答案就over了
然后就光荣超时60pts
然后我还挣扎了半天,,,什么数组模拟一个链表巴拉巴拉的,反正就是怎么搞都只有60,就很委屈
没有办法只能去看题解,这才发现我太幼稚了,如果我这个方法能过实在是太对不起正解了...
好趴其实正解也没有很复杂呢(...虽然我写了一个上午也没A...),大概还是理解了的呢,所以就还是港下正解趴
首先我们跑个最大生成树嘛这个其实和我的想法是一样的?主要是后面高级一些
这个最大生成树就和60pts的跑法是一样的,kruskal就成,顺便建棵树
然后倍增预处理下
然后每次读入的时候一路跑到俩点的LCA处答案一路取min最后输出就成了
对了有个小细节是,并查集会要用到两次,然后我第一次是搞了个按秩合并于是就会导致,第二次的时候会WA掉(...我调了30min才发现...心痛...)所以要搞俩find,不过我感觉我跑得还是比较快的了?应该比没有按秩合并的是快一些的!414ms我还是挺满足的了嘻嘻
然后听起来这么简单其实并没有...事实是我调了一个上午QAQ大概主要还是因为太菜了对倍增啊上提啊这些操作不够熟悉才会有这些破事儿.所以还是那个结论,菜是原罪QAQ
好那放了代码我就继续去刷题辽QAQ还有好多好多题目没有刷鸭QAQ
#include<bits/stdc++.h> using namespace std; #define ll int #define rp(i,x,y) for(register ll i=x;i<=y;++i) #define my(i,x,y) for(register ll i=x;i>=y;--i) +,N=+,Q=+; struct ed{ll to,from,wei;}edge[M]; ]; ll n,m,cjk,q,fa[N],deep[N],st[Q],en[Q],ans[Q],goldgenius,next[Q],last[Q],head[N],tot,fafa[N][],w[N][]; bool vis[N]; inline ll read() { ;; '))ch=getchar(); if(ch=='-')ch=getchar(); )+(x<<)+(ch^'),ch=getchar(); return y?x:-x; } inline bool cmp(ed x,ed y){return x.wei>y.wei;} inline ,n)fa[i]=fafa[i][]=i,w[i][]=;memset(ans,-,sizeof(ans));} ll fd(ll x){;return fa[x];} ll fdfd(ll x){if(fa[x]==x)return x;return fa[x]=fdfd(fa[x]);} inline void add(ll x,ll y,ll z){tree[++tot].to=x;tree[tot].next=head[y];tree[tot].w=z;head[y]=tot;} inline void link(ll x,ll y){if(deep[x]>deep[y])fa[x]=y;else fa[y]=x;} inline void krus() { while(cjk<m && goldgenius<n) { if (fd(edge[++cjk].to)!=fd(edge[cjk].from)) link(fa[edge[cjk].to], fa[edge[cjk].from]),add(edge[cjk].from,edge[cjk].to,edge[cjk].wei),add(edge[cjk].to,edge[cjk].from,edge[cjk].wei); ,++goldgenius;,++goldgenius; } } void dfs(ll u) { vis[u]=; for(register ll i=head[u];i;i=tree[i].next) ]=u,w[tree[i].to][]=tree[i].w,deep[tree[i].to]=deep[u]+,dfs(tree[i].to); } inline void bz() { memset(vis,,sizeof(vis)); rp(i,,n),dfs(i),fafa[i][]=i,w[i][]=; rp(i,,)rp(j,,n)fafa[j][i]=fafa[fafa[j][i-]][i-],w[j][i]=min(w[j][i-],w[fafa[j][i-]][i-]); } inline ll lca(ll x,ll y) { ; ll ans=;if(deep[x]<deep[y])swap(x,y); my(i,,)if(deep[fafa[x][i]]>=deep[y])ans=min(ans,w[x][i]),x=fafa[x][i]; if(x==y)return ans; my(i,,)if(fafa[x][i]!=fafa[y][i])ans=min(ans,min(w[x][i],w[y][i])),x=fafa[x][i],y=fafa[y][i]; ans=min(ans,min(w[x][],w[y][])); return ans; } int main() { // freopen("goldgenius.in","r",stdin); // freopen("cjk.out","w",stdout); n=read();m=read(); rp(i,,m){edge[i].to=read(),edge[i].from=read(),edge[i].wei=read();} sort(edge+,edge++m,cmp);q=read(); pre();krus();bz(); rp(i,,q){ll st=read(),en=read();printf("%d\n",lca(st,en));} ; }
洛谷P1967 货车运输 [noip2013] 图论的更多相关文章
- 洛谷 P1967 货车运输
洛谷 P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在 ...
- 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增
倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...
- 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
[洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...
- [NOIP2013] 提高组 洛谷P1967 货车运输
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- 洛谷—— P1967 货车运输 || COGS——C 1439. [NOIP2013]货车运输
https://www.luogu.org/problem/show?pid=1967#sub || http://www.cogs.pro/cogs/problem/problem.php?pi ...
- 洛谷 P1967 货车运输 Label: 倍增LCA && 最小瓶颈路
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- 洛谷 P1967 货车运输(克鲁斯卡尔重构树)
题目描述 AAA国有nn n座城市,编号从 11 1到n nn,城市之间有 mmm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qqq 辆货车在运输货物, 司机们想知道每辆车在不超过车 ...
- 洛谷P1967 货车运输
题目描述 \(A\)国有\(n\)座城市,编号从\(1\)到\(n\),城市之间有\(m\)条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有\(q\)辆货车在运输货物, 司机们想知道每辆车在 ...
- [洛谷 P1967] 货车运输 (最大生成树 lca)
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
随机推荐
- HTML 引用
关于 HTML 引用: (1) <q> 和 <blockquote> 用于实现长短不一的引用语(2) <q> 用于短的引用,<blockquote> 用 ...
- vim 编辑基础使用-----linux编程
Linux系统编程: VIM编辑器 | VIM Introduce 学习 vim 并且其会成为你最后一个使用的文本编辑器.没有比这个更好的文本编辑器了,非常地难学,但是却不可思议地好用. 我建议下面这 ...
- C++ template —— 模板基础(一)
<C++ Template>对Template各个方面进行了较为深度详细的解析,故而本系列博客按书本的各章顺序编排,并只作为简单的读书笔记,详细讲解请购买原版书籍(绝对物超所值).---- ...
- Jquery 网页转换为图片
/* html2canvas 0.5.0-alpha1 <http://html2canvas.hertzen.com> Copyright (c) 2015 Niklas von Her ...
- Matlab练习——寻找完全数
clc; clear; wq = []; : sum = ; k = ; : i / sum = sum + j; end end == i wq=[wq i]; end end disp(['2至1 ...
- php原生实现图片上传和查看
先上源码:upload_file.php <html> <body> <form action="upload_file.php" method=&q ...
- Objective-C官方文档 协议
版权声明:原创作品,谢绝转载!否则将追究法律责任. 在现实生活中,当处理某一情况的时候人们往往遵循严格的程序.执法人员他们在打官司的收集证据和询问的时候一定要遵守协议. 在面向对象的语言中,最重要的是 ...
- PCL—低层次视觉—关键点检测(iss&Trajkovic)
关键点检测往往需要和特征提取联合在一起,关键点检测的一个重要性质就是旋转不变性,也就是说,物体旋转后还能够检测出对应的关键点.不过说实话我觉的这个要求对机器人视觉来说是比较鸡肋的.因为机器人采集到的三 ...
- Android进程和线程(Android开发指南--译)
(转自:http://www.cnblogs.com/xitang/archive/2011/09/24/2189460.html) Processes and Threads 译者署名: 呆呆大虾 ...
- 第三步 Cordova 3.0(及以上版本) 添加插件
1.使用命令生成项目 例:cordova create jy110 com.example.jy110 jy110 2.使用命令添加插件(如果报错,可能是网络问题,可以多试几次,直到成功) 例:cor ...