关于思路:
在拓扑题集里发现了这只,怎么想怎么奇怪,产生冠军当且仅当整个拓扑序打出来是联通的,并且到尽头不能有两个以上出度为0的点,这咋判断?
根据冠军的定义,没输过,开两个set,一个存赢家,一个存输家,若赢家没在输家名单里出现过,则cnt++;
产生冠军当且仅当cnt=1;
关于实现:
实现过程中学到了set的几个用法
遍历时:
set<string>::iterator it=x.begin();
for(;it!=x.end();it++)
*it,表示it所取的string 或者 数字
x.find()返回的是地址,如果存在就返回地址啦,不存在就返回it.end()
--
#include <iostream> #include <math.h> #include <string.h> #include <vector> #include <map> #include <queue> #include <stdio.h> #include <algorithm> #include <cstdio> #include <set> using namespace std; set<string>win,lose; int main() { int n; while(cin>>n) { win.clear(); lose.clear(); if(n==0) break; for(int i=1;i<=n;i++) { string winer,loser; cin>>winer>>loser; win.insert(winer); lose.insert(loser); // cout<<winer<<endl; } set<string>::iterator to=win.begin(); int ok=0; for(;to!=win.end();to++) { //cout<<*to<<endl; if(lose.find(*to)==lose.end()) { ok++; } } if(ok==1) { cout<<"Yes"<<endl; } else cout<<"No"<<endl; } }