How far away ?
生活随笔
收集整理的這篇文章主要介紹了
How far away ?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://acm.hdu.edu.cn/showproblem.php?pid=2586
題解:LCA
參考文章:https://www.cnblogs.com/JVxie/p/4854719.html
https://blog.csdn.net/weixin_43272781/article/details/88797088
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=100000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,q,w,v,u; int ans,cnt,flag,temp,sum; int pre[N]; bool vis[N]; int dep[N]; int ANS[N]; char str; struct node{int v,w; }x,tmp; struct query{int u,v,id; }e[N],y; vector<node>G[N]; vector<query>Q[N]; int find(int x){return pre[x]==x?x:pre[x]=find(pre[x]);} void marge(int u,int v){int tu=find(u);int tv=find(v);if(tu!=tv){pre[tv]=tu;} } void Tarjan(int u){//marge和find為并查集合并函數和查找函數//cout<<u<<endl;vis[u]=1;for(int i=0,j=G[u].size();i<j;i++) { //訪問所有u子節點vint v=G[u][i].v;if(vis[v])continue;dep[v]=dep[u]+G[u][i].w;Tarjan(v); //繼續往下遍歷marge(u,v); //合并v到u上//cout<<dep[v]<<endl;}for(int i=0,j=Q[u].size();i<j;i++){ //訪問所有和u有詢問關系的eint e=Q[u][i].v;if(vis[e]){//ANS[Q[u][i].id]=find(e);//u,e的最近公共祖先為find(e);int lca=find(e);//cout<<lca<<endl;ANS[Q[u][i].id]=min( ANS[Q[u][i].id],dep[u]+dep[e]-2*dep[lca]);}} } void init(){for(int i=1;i<=n;i++){pre[i]=i;G[i].clear();Q[i].clear();}memset(vis,0,sizeof(vis));memset(dep,0,sizeof(dep));memset(ANS,0x3f,sizeof(ANS));} int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);init();for(int i=1;i<n;i++){scanf("%d%d%d",&u,&v,&k);x.v=v;x.w=k;G[u].push_back(x);x.v=u;G[v].push_back(x);}for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);y.v=v;y.id=i;Q[u].push_back(y);y.v=u;Q[v].push_back(y);}Tarjan(1);for(int i=1;i<=m;i++){cout<<ANS[i]<<endl;//cout<<<<endl;}//cout<<endl;}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的How far away ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Minimum Triangulatio
- 下一篇: 最近公共祖先(Lowest_Common