PKU1470+LCA

简单LCA。。。。但是输入的时候很恶心。。。。

看discuss,改了scanf才过了。。。

 1 /*
 2 LCA
 3 */
 4 #include<stdio.h>
 5 #include<string.h>
 6 #include<stdlib.h>
 7 #include<algorithm>
 8 #include<iostream>
 9 #include<queue>
10 #include<map>
11 #include<math.h>
12 using namespace std;
13 typedef long long ll;
14 //typedef __int64 int64;
15 const int maxn = 1005;
16 const int inf = 0x7fffffff;
17 const double pi=acos(-1.0);
18 const double eps = 1e-8;
19 int dis[ maxn ];
20 int ace[ maxn ],deep[ maxn ],fa[ maxn ];
21 int res[ maxn ];
22 struct node{
23     int u,next;
24 }edge[ maxn<<4 ];
25 int cnt,head[ maxn ];
26 void init(){
27     memset( res,0,sizeof( res ) );
28     memset( fa,0,sizeof( fa ) );
29     cnt = 0;
30     memset( head,-1,sizeof( head ) );
31 }
32 void addedge( int a,int b ){
33     edge[ cnt ].u = b;
34     edge[ cnt ].next = head[ a ];
35     head[ a ] = cnt++;
36 }
37 void dfs( int now,int now_father,int now_ace,int now_deep ){
38     fa[ now ] = now_father;
39     ace[ now ] = now_ace;
40     deep[ now ] = now_deep;
41     for( int i=head[ now ];i!=-1;i=edge[ i ].next ){
42         int v = edge[ i ].u;
43         dfs( v,now,now_ace,now_deep+1 );
44     }
45 }    
46 int find( int x,int y ){
47     if( x==y ) return x;
48     if( deep[x]>deep[y] ) return find( fa[x],y );
49     else return find( x,fa[y] );
50 }
51 int main(){
52     int n;
53     while( scanf("%d",&n)==1 ){
54         int cur,num,nxt;
55         init();
56         for( int i=1;i<=n;i++ ){
57             scanf("%d:(%d)",&cur,&num);
58             while( num-- ){
59                 scanf(" %d",&nxt);
60                 addedge( cur,nxt );
61             }
62         }
63         for( int i=1;i<=n;i++ ){
64             if( fa[i]==0 ){
65                 dfs( i,-1,i,0 );
66             }
67         }
68         int m;
69         scanf("%d",&m);
70         //printf("m=%d\n",m);
71         char ch1[2],ch2[2];
72         while( m-- ){
73             scanf("%1s%d%d%1s",ch1,&cur,&nxt,ch2);
74             int father = find( cur,nxt );
75             res[ father ]++;
76         }
77         //printf("m=%d\n",m);
78         for( int i=1;i<=n;i++ ){
79             if( res[i]!=0 ){
80                 printf("%d:%d\n",i,res[i]);
81             }
82         }
83     }
84     return 0;
85 } 
View Code
原文地址:https://www.cnblogs.com/xxx0624/p/3093434.html