poj1470(LCA模板题)
题目连接:http://poj.org/problem?id=1470
被输入卡到死。。。。。。
开始也看到输入格式的问题了,但是我以为查询的两个点的格式就是(u v)这样,其它地方可以无限空格。。。
为这一直WA啊,以为是算法哪块写挂了,一直找。。。。。
其实哪都可能有一堆空格(其实题目说的也很清楚了-_-||)。。。。
教训。。
还有一点,刚开始以为给出的第一个节点就是祖先,其实题目并没有这么说,看着图理解就误以为了那样了。。。
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn=920; 8 9 int first[maxn<<1],node[maxn<<1],dep[maxn<<1],dp[maxn<<1][25]; 10 int ans[maxn]; 11 int vis[maxn]; 12 13 struct edge 14 { 15 int v,nex; 16 }e[maxn]; 17 18 int head[maxn]; 19 int cnt=0; 20 int tot=0; 21 int in[maxn]; 22 void add(int u,int v) 23 { 24 e[cnt].v=v; 25 e[cnt].nex=head[u]; 26 head[u]=cnt++; 27 } 28 29 void dfs(int u,int d) 30 { 31 tot++; 32 node[tot]=u; 33 dep[tot]=d; 34 vis[u]=1; 35 first[u]=tot; 36 for(int i=head[u];i!=-1;i=e[i].nex) if(!vis[e[i].v]) 37 { 38 dfs(e[i].v,d+1); 39 tot++; 40 node[tot]=u; 41 dep[tot]=d; 42 } 43 } 44 45 void RMQ_INIT(int n) 46 { 47 int k=log2(n); 48 for(int i=1;i<=n;i++) dp[i][0]=i; 49 for(int j=1;j<=k;j++) 50 for(int i=1;i+(1<<j)-1<=n;i++) 51 { 52 int a=dp[i][j-1]; 53 int b=dp[i+(1<<j-1)][j-1]; 54 if(dep[a]<dep[b]) dp[i][j]=a; 55 else dp[i][j]=b; 56 } 57 } 58 59 int rmq(int x,int y) 60 { 61 int k=log2(y-x+1); 62 int a=dp[x][k]; 63 int b=dp[y-(1<<k)+1][k]; 64 if(dep[a]<dep[b]) return a; 65 return b; 66 } 67 int lca(int a,int b) 68 { 69 int x=first[a]; 70 int y=first[b]; 71 int k; 72 if(x<=y) 73 { 74 k=rmq(x,y); 75 return node[k]; 76 } 77 else 78 { 79 k=rmq(y,x); 80 return node[k]; 81 } 82 } 83 int main() 84 { 85 int n,q; 86 while(scanf("%d",&n)!=EOF) 87 { 88 memset(ans,0,sizeof(ans)); 89 memset(vis,0,sizeof(vis)); 90 memset(head,-1,sizeof(head)); 91 memset(in,0,sizeof(in)); 92 tot=0; 93 cnt=0; 94 int m; 95 int u,v; 96 for(int i=0;i<n;i++) 97 { 98 scanf("%d:(%d)",&u,&m); 99 for(int j=0;j<m;j++) 100 { 101 scanf("%d",&v); 102 in[v]++; 103 add(u,v); 104 // add(v,u); 105 } 106 } 107 for(int i=1;i<=n;i++) if(!in[i]) 108 dfs(i,1); 109 // for(int i=0;i<=tot;i++) 110 // printf("%d ",node[i]); 111 // puts(""); 112 RMQ_INIT(tot); 113 scanf("%d",&q); 114 char f[3],g[3]; 115 while(q--) 116 { 117 /* 错误读入方式示范。。。 118 scanf("%s%s",f,g); 119 u=f[1]-'0'; 120 v=g[0]-'0'; 121 */ 122 while(getchar()!='(') ; 123 scanf("%d%d",&u,&v); 124 int h=lca(u,v); 125 ans[h]+=1; 126 while(getchar()!=')'); 127 } 128 for(int i=1;i<=n;i++) 129 if(ans[i]) printf("%d:%d\n",i,ans[i]); 130 } 131 }