洛谷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 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
随机推荐
- Ansible的Inventory管理
Ansible将可管理的服务器集合成为Inventory,Inventory的管理便是服务器的管理. hosts文件的位置: /etc/ansible/hosts 在命令行通过-i参数指定 通过/et ...
- PyQt4程序图标
程序图标就是一个小图片,通常显示在程序图标的左上角(ubuntu gnome在最上侧). #!/usr/bin/python # -*- coding:utf-8 -*- import sys fro ...
- 【Python3】 使用django 2.0 + python3.6.4 创建应用
python版本:3.6.4 django版本:2.0 1 创建应用 输入命令 python manage.py startapp blog 2 在项目目录创建 templates文件夹 用于存放我们 ...
- python框架---->APScheduler的使用
这里介绍一下python中关于定时器的一些使用,包括原生的sche包和第三方框架APScheduler的实现.流年未亡,夏日已尽.种花的人变成了看花的人,看花的人变成了葬花的人. python中的sc ...
- Android 本地tomcat服务器接收处理手机上传的数据之环境搭建
上一篇:Android 使用tomcat搭建HTTP文件下载服务器 本篇文章 环境:win7 + jdk1.7 + tomcat v8.0.53 工具: 1.Eclipse Eclips ...
- Message Queue
RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发.同时实现了一个经 ...
- vue-loader的简单例子
一.模块加载器 1.broserify 模块加载器, 只能加载js 2.webpack 模块加载器, 一切东西都是模块, 最后打包到一块 .vue文件 ==> 需要用webpack编译成浏览器 ...
- mysql概要(十四)(二)索引(补充:外键级联操作)
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] [ ON UPDATE { NO ACTION | CASCADE | S ...
- jfinal如何获取参数为数组的值
前台: var postParams = { ids:["qw","ew"]}; 后台: String[] userids = this.getParaValu ...
- 让HTML标签、DIV、SPAN拥有focus事件和blur事件,聚焦和失焦
DIV和其他普通标签是不具有onfocus和onblur事件的.INPUT和A标签为什么拥有?而DIV和SPAN等普通标签却没有?有时候我们习惯性用键盘的TAB来移动光标,仔细看你会发现,光标只在IN ...