BZOJ 3732: Network|Kruskal|Lca
来源:互联网 发布:中国日本妹子知乎 编辑:程序博客网 时间:2024/06/06 00:04
这题似乎和一道NOIP的题差不多,相似度直达98%
怪不得想出了思路……
Kruskal求最小生成树合并的时候添加一个带权的点权值为当前枚举的边的权值
把当前边上的两个点所在的并查集的根都连到新添的点上做他的儿子
然后询问的时候只需找出两个点的lca,lca的权值即为答案
Lca我写的树剖 hhhhhhh真是有自信
#include<set>#include<map>#include<ctime>#include<queue>#include<cmath>#include<cstdio>#include<vector>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#define T 455555using namespace std;int sc(){ int i=0,f=1; char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i*f;}int top[T],size[T],deep[T];struct Edge{int x,y,v;} e[T];int head[T],lst[T],nxt[T];int fa[T],v[T];int n,m,K,cnt,tot;bool cmp(Edge a,Edge b){return a.v<b.v;}int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}void insert(int x,int y){ lst[++tot]=y;nxt[tot]=head[x];head[x]=tot;}void dfs(int x,int f){ fa[x]=f; size[x]=1; deep[x]=deep[f]+1; for(int i=head[x];i;i=nxt[i]) { dfs(lst[i],x); size[x]+=size[lst[i]]; }}void _dfs(int x,int htp){ top[x]=htp; int k=0; for(int i=head[x];i;i=nxt[i]) if(size[lst[i]]>size[k])k=lst[i]; if(!k)return; _dfs(k,htp); for(int i=head[x];i;i=nxt[i]) if(lst[i]!=k) _dfs(lst[i],lst[i]);}int Lca(int x,int y){ while(top[x]!=top[y]) { if(deep[top[x]]<deep[top[y]])swap(x,y); x=fa[top[x]]; } return deep[x]<deep[y]?x:y;}int main(){ n=sc();m=sc();K=sc(); for(int i=1;i<=m;i++) { e[i].x=sc(); e[i].y=sc(); e[i].v=sc(); } sort(e+1,e+m+1,cmp); cnt=n,n<<=1; for(int i=1;i<=n;i++)fa[i]=i; for(int i=1;i<=m;i++) { int p=find(e[i].x),q=find(e[i].y); if(p!=q) { cnt++; v[cnt]=e[i].v; fa[q]=fa[p]=cnt; insert(cnt,q); insert(cnt,p); if(cnt==n-1)break; } } dfs(cnt,0); _dfs(cnt,cnt); for(int i=1;i<=K;i++) { int x=sc(),y=sc(),lca=Lca(x,y); printf("%d\n",v[lca]); } return 0;}
0 0
- BZOJ 3732: Network|Kruskal|Lca
- BZOJ 3732 Network Kruskal+倍增LCA
- bzoj 3732(kruskal+LCA)
- BZOJ 3732 Network Kruskal重构树
- 【BZOJ 3732】Network kruskal树
- BZOJ 3732 Network Kruskal+倍增
- [BZOJ]3732: Network 最小生成树 LCA
- 倍增LCA(bzoj 3732: Network)
- bzoj 3732: Network (最小生成树+LCA)
- BZOJ 3732 Network —— 最小生成树 + 倍增LCA
- BZOJ 4144 Dijkstra+Kruskal+倍增LCA
- 【BZOJ】Network 最小生成树+LCA
- Network(Kruskal)
- 【bzoj 3732】Network
- BZOJ 3732: Network
- BZOJ 3732: Network
- 文章标题 CSU 1845: Sensor network (暴力LCA+kruskal思想)
- BZOJ-1977 次小生成树 Tree 树上倍增LCA+Kruskal+位运算
- Android 通过子线程加载URL图片
- 安卓在定义的view中实现手势识别上,下,左,右的功能
- Spring注解详解
- Bitmap recycle方法与制作Bitmap的内存缓存
- 生成和打上patch的方法
- BZOJ 3732: Network|Kruskal|Lca
- .NET PDB文件到底是什么?
- 使用ps命令查看使用内存或CPU最多的10个进程
- iOS Qt 子线程与主线程通讯
- 动态代理
- Android43_Touch事件的分发和消费机制
- 《算法导论》课程笔记(2)- 渐近符号、递归及解法
- debian的自动化安装定制
- 责任链模式【Chain of Responsibility Pattern