洛谷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));} ; }
最新文章
- java常用的设计模式
- HTML5中引入的关键特性
- JSON数据格式
- prop
- LeetCode----3 Sum
- 页面多语系自动切换-.resx
- 系统监控的一些工具w , vmstat
- Python简易爬虫
- office文件的预览
- react+redux渲染性能优化原理
- Android开发相关操作
- vue常用的网址
- rabbitmq 3.7.8基于centos7部署文档
- PAT A1110 Complete Binary Tree (25 分)——完全二叉树,字符串转数字
- dp小结|背包问题
- week7:个人博客作业
- testNG retry 失败的testcase只需要在xml中配置一个listener即可
- relocation error: /usr/lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference 问题解决
- WARNING [main] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [] milliseconds.
- 线程属性API