只需要标记这个人是否被打败,最后搜索没有被打败的是否仅有一人,是则产生冠军。
据说只需要建立两个set,一个存总人数,一个存被打败的人,最后判断两个set的元素差是否为1,是就输出Yes,否则No。
#include<iostream> #include<string> #include<map> using namespace std; int main(){ int n; while(cin>>n&&n){ string s1,s2; map<string,int> mp; int f[2000]={0}; int k=1; for(int i=0;i<n;i++){ cin>>s1>>s2; if(mp.find(s1)==mp.end()){ mp[s1] = k; k++; } if(mp.find(s2)==mp.end()){ mp[s2] = k; k++; } f[mp[s2]] = mp[s1]; //标记被谁打败 } int flag = 0; for(int i=1;i<k;i++){ //查找没被打败的人数 if(f[i]==0&&flag){ flag=0; break; } if(f[i]==0&&flag==0){ flag = 1; } } if(flag==1)cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }