洛谷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 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
随机推荐
- PHP代码审计笔记--文件包含漏洞
有限制的本地文件包含: <?php include($_GET['file'].".php"); ?> %00截断: ?file=C://Windows//win.in ...
- 使用 urllib 解析 URL 链接
urllib 库还提供了 parse 模块,它定义了处理 URL 的标准接口,例如实现 URL 各部分的抽取.合并以及链接转换,常用的方法如下: In []: from urllib.parse im ...
- 初步总结javascript中学习DOM之前的知识
嘿嘿,又到了周末时间,周六其实就是总结这周的学习的,记得周二周三刚开始接触javascript时间,还是不知道怎么学习的,就感觉找不到方向,那时间学习的只是总结了一些简单的定义或者是学习结构,今天就把 ...
- XML的基本用法
一.概述 XML全称为可扩展的标记语言.主要用于描述数据和用作配置文件. XML文档在逻辑上主要由一下5个部分组成: XML声明:指明所用XML的版本.文档的编码.文档的独立性信息 文档类型声明:指出 ...
- chattr lsattr
chattr命令的用法:chattr [ -RVf ] [ -v version ] [ mode ] files…最关键的是在[mode]部分,[mode]部分是由+-=和[ASacDdIijsTt ...
- 【宝塔】 安装扩展Memcached redis 教程
宝塔官网: www.bt.cn 开始安装 1 进入ssh 输入以下指令, wget -O ext.sh http://125.88.182.172:5880/ext/ext.sh && ...
- springboot---->springboot中的格式化(一)
这里面我们简单的学习一下springboot中关于数据格式化的使用.我以为你不是个好人,没想到你连个坏人都不是. springboot中的格式化 我们的测试环境是springboot,一个将字符串格式 ...
- JS - 常用效果代码库 (四)
1.首字母大写示例: var value = “一段文本或一个参数”; value = value.toString() return value.charAt(0).toUpperCase() + ...
- Android 本地tomcat服务器接收处理手机上传的数据之案例演示
上一篇:Android 本地tomcat服务器接收处理手机上传的数据之环境搭建 本篇基于上一篇搭建的服务器端环境,具体介绍Android真机上传数据到tomcat服务器的交互过程 场景:A ...
- gerrit_bash_commands.sh
https://github.com/tomwys/gerrit-bash-commands gerrit_bash_commands.sh # Author: Tomasz Wysocki < ...