判断顶点入度是否唯一即可。如果入度为0的节点只有一个,输出Yes,否则输出No。
代码:
1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 6 int len; 7 int map[1001][1001]; 8 char name[1001][100]; 9 10 int func(char str[]) 11 { 12 int i; 13 for (i=0; i<len; i++) 14 { 15 if (strcmp(name[i], str)==0) 16 return i; 17 } 18 strcpy(name[len], str); 19 len++; 20 return i; 21 } 22 23 int main() 24 { 25 int a, b; 26 int n, i; 27 int dgr[1001]; 28 char s1[100], s2[100]; 29 while(cin >> n, n) 30 { 31 memset(name, 0, sizeof(name)); 32 memset(dgr, 0, sizeof(dgr)); 33 memset(map, 0, sizeof(map)); 34 int cnt=0; 35 len=0; 36 for (i=0; i<n; i++) 37 { 38 cin >> s1 >> s2; 39 a=func(s1); 40 b=func(s2); 41 if (map[a][b] == 0) //重复不计 42 { 43 map[a][b]=1; 44 dgr[b]++; 45 } 46 } 47 for (i=0; i<len; i++) //计数入度为0的节点的个数 48 { 49 if (dgr[i] == 0) 50 cnt++; 51 } 52 if(cnt == 1) //判断入度为是否0 53 cout << "Yes" << endl; 54 else 55 cout << "No" << endl; 56 } 57 return 0; 58 }