//使用"刷表"Dp即刻递推求解 //做的时候忽视了以个bug,,就是忘记盘入度是0的时候再加入队列了 #include <iostream> #include <queue> #include <stack> #include <string> #include <map> #include <vector> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const int MAX=205,INF=1<<30; int n,l; map<string,int> mymap; map<string,int>::iterator it; struct State{ int s,gs; int val; }; int root; int fa[MAX]; int degree[MAX]; bool inqueue[MAX]; int Queue[MAX],front,rear; State d[MAX]; bool G[MAX][MAX]; bool unique(int boss){ bool flag; int s=d[boss].s,gs=d[boss].gs; if(s==gs){ return 0; } else if(s>gs){ flag=1; for(int i=1;i<l;i++){ if(G[boss][i]&&!unique(i)){ flag=0; } } } else{ flag=1; for(int i=1;i<l;i++){ if(G[boss][i]){ for(int j=1;j<l;j++){ if(G[i][j]&&!unique(j)){ flag=0; } } } } } return flag; } int main() { #ifndef ONLINE_JUDGE freopen("i.txt", "r", stdin); #endif string name,e,b; int u,v,gv; while(cin>>n,n){ l=1; mymap.clear(); memset(degree,0,sizeof(degree)); memset(inqueue,0,sizeof(inqueue)); memset(G,0,sizeof(G)); cin>>name; mymap[name]=root=l++; for(int i=0;i<n-1;i++){ cin>>e>>b; it=mymap.find(e); if(it!=mymap.end()) u=it->second; else mymap[e]=u=l++; it=mymap.find(b); if(it!=mymap.end()) v=it->second; else mymap[b]=v=l++; ++degree[v]; fa[u]=v; G[v][u]=1; } front=0; rear=0; for(int i=1;i<l;i++){ if(!degree[i]){ inqueue[i]=1; Queue[rear++]=i; } } for(int i=0;i<l;i++){ d[i].s=0; d[i].gs=1; } while(front<rear){ u=Queue[front++]; d[u].val=max(d[u].s,d[u].gs); v=fa[u]; gv=fa[v]; d[v].s+=d[u].val; d[gv].gs+=d[u].val; --degree[v]; // 错误的方法:没有判断入度为0就加入队列,导致状态的无序 // if(!inqueue[v]){ // inqueue[v]=1; // Queue[rear++]=v; // } if(!inqueue[v]&°ree[v]<=0){ inqueue[v]=1; Queue[rear++]=v; } } cout<<d[root].val<<" "; if(unique(root)) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }