果然A得辛苦,我想是用错模板了。囧,好累。http://www.cppblog.com/abilitytao/archive/2009/09/21/96886.html #include<iostream> #include<string> #include<cstdio> #include<vector> using namespace std; const int maxn=906; vector<int >p[maxn]; class node { public: int v,next; }; node g[maxn*4]; int head[maxn],in[maxn],time[maxn],vis[maxn]; int f[maxn],r[maxn],ancestor[maxn]; int cnt,n,m; void ini() { int i; for(i=1;i<=n;i++) { f[i]=i;r[i]=1; in[i]=0;time[i]=0; head[i]=0; vis[i]=0;ancestor[i]=0; p[i].clear (); } cnt=0; } void read() { int i,a,b,c,k; char ch; for(i=0;i<n;i++) { scanf("%d:(%d)",&a,& b); for(k=0;k<b;k++) { scanf("%d",&c); g[++cnt].v =c; g[cnt].next =head[a]; head[a]=cnt; in[c]++; } } scanf("%d",&m); for(i=0;i<m;i++) { while(getchar()!='('); scanf("%d %d)",&a,&b); p[a].push_back (b); p[b].push_back (a); } } int Find(int u) { if(f[u]==u) return u; f[u]=Find(f[u]); return f[u]; } void Union(int u,int v) { int a=Find(u); int b=Find(v); if(a==b) return ; if(r[a]<r[b]) { f[a]=b;r[b]+=r[a]; } else { f[b]=a;r[a]+=r[b]; } } void LCA(int u) { ancestor[u]=u; int i; for(i=head[u];i;i=g[i].next ) { int v=g[i].v; LCA(v); Union(u,v); ancestor[Find(u)]=u; } vis[u]=1; int size=p[u].size(); for(i=0;i<size;i++) { if(vis[p[u][i]]==1) time[ancestor[Find(p[u][i])]]++; } } int main() { int i; while(scanf("%d",&n)!=EOF) { ini(); read(); for(i=1;i<=n;i++) if(!in[i]) break; LCA(i); for(i=1;i<=n;i++) if(time[i]) printf("%d:%d/n",i,time[i]); } return 0; }