1. 程式人生 > >codevs 1503 愚蠢的寵物

codevs 1503 愚蠢的寵物

deep ble open print bit pan include add scan

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

codevs 1503 愚蠢的寵物