hdu 2586(LCA的离线做法)
生活随笔
收集整理的這篇文章主要介紹了
hdu 2586(LCA的离线做法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
lca上的tarjan,改了我一下午加一晚上的bug,還無奈重寫了一次。就是尋找最近公共祖先lca(u,v
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int maxn=40000+100; int n,m,k1,k2,t; int hade1[maxn],hade2[maxn]; int d[maxn],c[maxn]; bool vis[maxn]; struct note { int fr;int next;int to;int len;int lca; }aa[maxn*2],bb[1000]; void addage1(int fr,int to,int len) {aa[k1].to=to;aa[k1].len=len;aa[k1].next=hade1[fr];hade1[fr]=k1++; } void addage2(int fr,int to) {bb[k2].fr=fr;bb[k2].to=to;bb[k2].lca=-1;bb[k2].next=hade2[fr];hade2[fr]=k2++; } void init() {memset(hade1,-1,sizeof(hade1));memset(hade2,-1,sizeof(hade2));memset(d,0,sizeof(d));memset(vis,0,sizeof(vis));k1=k2=0; } int found(int x) {if(x==c[x]) return x;else return c[x]=found(c[x]); } void unit(int x,int y) {x=found(x);y=found(y);if(x!=y)c[y]=x; } void tarjan(int u) {vis[u]=1;c[u]=u;for(int i=hade1[u];i!=-1;i=aa[i].next){int v=aa[i].to;int w=aa[i].len;if(!vis[v]){d[v]=d[u]+w;//從此節點到根節點的距離 tarjan(v);unit(u,v);}}for(int i=hade2[u];i!=-1;i=bb[i].next){int v=bb[i].to;if(vis[v]){bb[i].lca=bb[i^1].lca=found(v);//回溯的是u和v最近公共子節點的分支,所以v是指向最近公共子節點的 }}} int main() {scanf("%d",&t);while(t--){ init();scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int fr,to,len;scanf("%d%d%d",&fr,&to,&len);addage1(fr,to,len);addage1(to,fr,len);}for(int i=0;i<m;i++){int fr,to;scanf("%d%d",&fr,&to);addage2(fr,to);addage2(to,fr);}d[1]=0;tarjan(1);for(int i=0;i<m;i++){int s=i*2;int u=bb[s].fr,v=bb[s].to,lca=bb[s].lca;int mm=d[u]+d[v]-2*d[lca];printf("%d\n",mm);}}return 0; }?
)
轉載于:https://www.cnblogs.com/Wangwanxiang/p/7524545.html
總結
以上是生活随笔為你收集整理的hdu 2586(LCA的离线做法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jsoup(二)-- Jsoup查找DO
- 下一篇: 网站多语言切换插件