티스토리 뷰

Algorithm/BOJ

3176 도로 네트워크

henry1214 2018. 9. 5. 21:01

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
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday