日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj1787

發布時間:2025/5/22 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj1787 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

lca裸題,畫畫圖看看就可以了,找出那個一次公共祖先,求距離

#include<iostream> #include<set> #include<cstring> #include<algorithm> #include<cmath> #include<cstdio> #include<vector> using namespace std; int n,m,u,v,a,b,c,ans,temp1; int used[1000010],dis[1000010],dep[1000010]; int acs[1000010][23]; vector<int>graph[1000010]; void dfs(int u,int d) {used[u]=1;dep[u]=d;for(int i=0;i<graph[u].size();i++){int v=graph[u][i];if(!used[v]){acs[v][0]=u;dfs(v,d+1);}} } void get_acs() { for(int j=1;j<=22;j++)for(int i=1;i<=n;i++)if(acs[i][j-1]<0)acs[i][j]=-1;elseacs[i][j]=acs[acs[i][j-1]][j-1]; } int lca(int x,int y) { if(dep[x]<dep[y])swap(x,y);int d=dep[x]-dep[y];for(int k=22;k>=0;k--)if(acs[x][k]!=-1&&(d&(1<<k)))x=acs[x][k];if(x==y)return x;for(int k=22;k>=0;k--)if(acs[x][k]>0&&acs[y][k]>0&&acs[x][k]!=acs[y][k]){x=acs[x][k];y=acs[y][k];}return acs[x][0]; } inline int calc(int x,int y) {int temp=lca(x,y);return abs(dep[x]-dep[temp])+abs(dep[y]-dep[temp]); } int main() {cin>>n>>m;for(int i=1;i<n;i++){scanf("%d%d",&u,&v);graph[u].push_back(v);graph[v].push_back(u);} memset(acs,-1,sizeof(acs));dfs(1,1);get_acs(); // cout<<endl;for(int i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);int x=lca(a,b);int y=lca(b,c);int z=lca(c,a);if(x==y)temp1=z;elseif(y==z)temp1=x;elseif(x==z)temp1=y;ans=calc(a,temp1)+calc(b,temp1)+calc(c,temp1);printf("%d %d\n",temp1,ans); }return 0; }

?

轉載于:https://www.cnblogs.com/19992147orz/p/6034481.html

總結

以上是生活随笔為你收集整理的bzoj1787的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。