티스토리 뷰
https://www.acmicpc.net/problem/3176
parent[i][j] = 노드 i의 2^j번째 조상
maxd[i][j] = 노드 i부터 2^j번째 조상까지의 간선 중 최대값
mind[i][j] = 노드 i부터 2^j번째 조상까지의 간선 중 최소값
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include <cstdio> #include <vector> #include <algorithm> #define N 100005 #define INF 987654321 using namespace std; int n,m,u,v,w,maxv,minv; int parent[N][21],check[N],depth[N],maxd[N][21],mind[N][21]; vector<pair<int,int>> a[N]; void dfs(int now,int d) { check[now]=true; depth[now]=d; for(auto i : a[now]) { int next=i.first,cost=i.second; if(check[next]) continue; parent[next][0]=now; maxd[next][0]=cost; mind[next][0]=cost; dfs(next,d+1); } } void lca(int x,int y) { if(depth[x]>depth[y]) swap(x,y); for(int i=20;i>=0;i--) { if(depth[y]-depth[x]>=(1<<i)) { maxv=max(maxv,maxd[y][i]); minv=min(minv,mind[y][i]); y=parent[y][i]; } } if(x==y) return; for(int i=20;i>=0;i--) { if(parent[x][i]!=parent[y][i]) { maxv=max(maxv,max(maxd[x][i],maxd[y][i])); minv=min(minv,min(mind[x][i],mind[y][i])); x=parent[x][i],y=parent[y][i]; } } maxv=max(maxv,max(maxd[x][0],maxd[y][0])); minv=min(minv,min(mind[x][0],mind[y][0])); } int main() { scanf("%d",&n); for(int i=0;i<n-1;i++) { scanf("%d %d %d",&u,&v,&w); a[u].push_back({v,w}); a[v].push_back({u,w}); } dfs(1,1); for(int j=1;j<21;j++) { for(int i=1;i<=n;i++) { parent[i][j]=parent[parent[i][j-1]][j-1]; maxd[i][j]=max(maxd[i][j-1],maxd[parent[i][j-1]][j-1]); mind[i][j]=min(mind[i][j-1],mind[parent[i][j-1]][j-1]); } } scanf("%d",&m); while(m--) { scanf("%d %d",&u,&v); maxv=-INF,minv=INF; lca(u,v); printf("%d %d\n",minv,maxv); } return 0; } | cs |
'Algorithm > BOJ' 카테고리의 다른 글
15683 감시 (0) | 2018.09.11 |
---|---|
3474 교수가 된 현우 (0) | 2018.09.06 |
11438 LCA 2 (0) | 2018.09.05 |
1991 트리 순회 (0) | 2018.09.05 |
4447 좋은놈 나쁜놈 (0) | 2018.07.20 |