洛谷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 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
随机推荐
- Nginx(十二)-- Nginx+keepalived实现高可用
1.前提 两台Linux服务器,IP分别为192.168.80.128 和 192.168.80.129,都安装Nginx和keepalived,并启动. 2.配置双机热备 1.将192.168.80 ...
- JQuery学习的尾声
今天是最后一天学习JQuery,上周我们在狠狠的学习JavaScript,然后在这周我们又把JQuery扼杀在了摇篮里面,纵然学习的太快我们导致我们知识不牢固,可是我们没有那么多的时间学习的如此详细, ...
- router之switch
比较路由中有无switch的区别: 代码一: <Router history={history}> <Route exact path="/" component ...
- Oracle SQL Developer保持数据库连接的方法
一.概述 从navicat切到pl/sql developer,但是发现个bug,因为本地客户端pl/sql developer的字符集 和数据库服务器的字符集不一致,导致一个很奇葩的东西. 本来我有 ...
- php5.4 traits
PHP 5.4中的traits,是新引入的特性,中文还真不知道如何准确翻译好.其实际的目的,是为了有的场合想用多继承,但PHP又没多继承,于是就发明了这样的一个东西. Traits可以理解 ...
- 3-2 axios基础介绍
1.静态引用 <script src="https://unpkg.com/axios/dist/axios.min.js"></script> 2.npm ...
- C语言assert()函数用法总结
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h> void assert( i ...
- Unity3D之游戏架构脚本该如何来写
这篇文章主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难.这篇文章的目的是让哪些已经上手Unity3D游戏引擎的朋友 ...
- Node.js 文件系统fs模块
Node.js 文件系统封装在 fs 模块是中,它提供了文件的读取.写入.更名.删除.遍历目录.链接等POSIX 文件系统操作. 与其他模块不同的是,fs 模块中所有的操作都提供了异步的和 同步的两个 ...
- Spark2 加载保存文件,数据文件转换成数据框dataframe
hadoop fs -put /home/wangxiao/data/ml/Affairs.csv /datafile/wangxiao/ hadoop fs -ls -R /datafiledrwx ...