Time Limit: 2000MS | Memory Limit: 10000K | |
Total Submissions: 16671 | Accepted: 5319 |
Description
Input
Output
Sample Input
5 5:(3) 1 4 2 1:(0) 4:(0) 2:(1) 3 3:(0) 6 (1 5) (1 4) (4 2) (2 3) (1 3) (4 3)
Sample Output
2:1 5:5
Hint
Source
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #include<iostream> using namespace std; int n,m; int head[1010],vis[1010],pre[1010],dig[1010],cnt,flag,a,b,cot[1010],ans[1010]; vector<int>vt[1010]; struct s { int u,v,next; }edge[1010]; int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } void init() { memset(vis,0,sizeof(vis)); memset(head,-1,sizeof(head)); memset(dig,0,sizeof(dig)); cnt=0; memset(cot,0,sizeof(cot)); for(int i=0;i<=n;i++) vt[i].clear(); } void add(int u,int v) { edge[cnt].u=u; edge[cnt].v=v; edge[cnt].next=head[u]; head[u]=cnt++; } int find(int x) { if(x==pre[x]) return x; return find(pre[x]); } void tarjan(int u) { pre[u]=u; vis[u]=1; int i; for(i=0;i<vt[u].size();i++) { int v=vt[u][i]; if(vis[v]) cot[find(v)]++; } for(i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(!vis[v]) { tarjan(v); pre[v]=u; } } } int main() { while(scanf("%d",&n)!=EOF) { int i,j; init(); for(i=0;i<n;i++) { int u,num; scanf("%d:",&u); scanf("(%d)",&num); while(num--) { int v; scanf("%d",&v); add(u,v); dig[v]++; } } int root; scanf("%d",&m); while(m--) { while(getchar()!='('); scanf("%d %d",&a,&b); while(getchar()!=')'); vt[a].push_back(b); vt[b].push_back(a); } for(i=1;i<=n;i++) { if(dig[i]==0) { tarjan(i); break; } } for(i=1;i<=n;i++) { if(cot[i]) { printf("%d:%d\n",i,cot[i]); } } } }
POJ 题目1470 Closest Common Ancestors(LCA)
原文:http://blog.csdn.net/yu_ch_sh/article/details/45097783