小记:只要是只有一个0入度的点,就能产生冠军,否则不可以
思路:如上
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <string>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
#define REP(a,b,c) for(int a = b; a < c; ++a)
#define eps 10e-8
const int MAX_ = 510;
const int N = 100010;
const int INF = 0x7fffffff;
int in[MAX_], out[MAX_];
int g[MAX_][MAX_];
int n,m,cnt;
map<string ,int>mp;
int topsort() {
int tmp;
bool flag = false, ok = true;
REP(i, 1, cnt){
if(in[i] == 0){
if(flag)return 0;
flag = true;
}
}
if(flag)return 1;
else
return 0;
}
int main() {
int T, s, t;
string s1, s2;
while(~scanf("%d", &n), n) {
mst(g, 0);
mst(out, 0);
mst(in, 0);
mp.clear();
cnt = 1;
REP(i, 0, n) {
cin>>s1>>s2;
if(mp[s1] == 0){
mp[s1] = cnt++;
}
s = mp[s1];
if(mp[s2] == 0){
mp[s2] = cnt++;
}
t = mp[s2];
g[s][t] ++;
out[s] ++;
in[t] ++;
}
int ans = topsort();
if(ans){
printf("Yes\n");
}else printf("No\n");
}
return 0;
}