• codevs 1503 愚蠢的宠物


    1503 愚蠢的宠物

     1 #include<iostream>  
     2 #include<algorithm>  
     3 #include<cstring>  
     4 using namespace std;  
     5   
     6 #define maxn 1000000+100  
     7 int father[maxn];  
     8 int a[maxn],b[maxn];  
     9 int main()  
    10 {  
    11     int n,x,y;  
    12     memset(a,0x3f,sizeof(a));  
    13     memset(b,0x3f,sizeof(b));  
    14     cin>>n;  
    15     for(int i=1;i<=n;i++)  
    16         father[i]=i;  
    17     for(int i=1;i<n;i++)  
    18     {  
    19         cin>>x>>y;  
    20         father[y]=x;  
    21     }  
    22     cin>>x>>y;  
    23     for(int i=0;i<n;i++)  
    24     {  
    25         a[x]=min(i,a[x]);  
    26         x=father[x];  
    27         b[y]=min(i,b[y]);  
    28         y=father[y];  
    29     }  
    30     int mn=999999,ans;  
    31     for(int i=1;i<=n;i++)  
    32     {  
    33         if(a[i]+b[i]<mn){  
    34             mn=a[i]+b[i];  
    35             ans=i;  
    36         }  
    37     }  
    38     cout<<ans;  
    39     return 0;  
    40 } 
    并查集
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define maxn 1000000
     4 int n,x,y,head[maxn],num;
     5 int deep[maxn],size[maxn],dad[maxn],top[maxn];
     6 
     7 struct Edge{
     8     int v,next;
     9 }edge[maxn];
    10 
    11 void add(int u,int v)
    12 {
    13     edge[++num].v=v;
    14     edge[num].next=head[u];
    15     head[u]=num;
    16 }
    17 
    18 void dfs(int x)
    19 {
    20     size[x]=1 ; deep[x]=deep[dad[x]]+1;
    21     for(int i=head[x];i;i=edge[i].next)
    22     {
    23         int v=edge[i].v;
    24         if(dad[x]==v) continue;
    25         dad[v]=x; dfs(v); size[x]+=size[v];
    26      }
    27 }
    28 
    29 void dfs2(int x)
    30 {
    31     int t=0; if(!top[x]) top[x]=x;
    32     for(int i=head[x];i;i=edge[i].next)
    33     {
    34         int v=edge[i].v;
    35         if(dad[x]!=v&&size[t]<size[v]) t=v;
    36     }
    37     if(t) top[t]=top[x],dfs2(t);
    38     for(int i=head[x];i;i=edge[i].next)
    39     {
    40         int v=edge[i].v;
    41         if(dad[x]!=v&&t!=v) dfs2(v);
    42     }
    43 }
    44 
    45 int lca(int x,int y)
    46 {
    47     for(;top[x]!=top[y];x=dad[top[x]])
    48         if(deep[top[x]]<deep[top[y]]) swap(x,y);
    49     return deep[x]<deep[y]?x:y;
    50 }
    51 
    52 
    53 int main()
    54 {
    55     scanf("%d",&n);
    56     for(int i=1;i<n;i++)
    57     {
    58         scanf("%d%d",&x,&y);
    59         add(x,y); add(y,x);
    60     }
    61     dfs(1); dfs2(1);
    62     int a,b,ans;
    63     scanf("%d%d",&a,&b);
    64     printf("%d",lca(a,b));
    65     return 0;
    66 }
    LCA
  • 相关阅读:
    sqlmap使用教程-安装教程
    SQL注入攻击总结
    mysql 创建函数失败解决办法,版本 8.0.26
    【VUE3.0体验】axios引入以及property的替代
    异化的房价周期
    vue使用websoket
    spring依赖注入方式及springBoot如何解决循环依赖
    范型的正确使用
    mysql GROUP_CONCAT使用
    Mybatis-MySQL 中使用IFNUL
  • 原文地址:https://www.cnblogs.com/chen74123/p/7504284.html
Copyright © 2020-2023  润新知