hdu 2094 产生冠军 是脑筋急转弯不是拓扑

关于思路:

在拓扑题集里发现了这只,怎么想怎么奇怪,产生冠军当且仅当整个拓扑序打出来是联通的,并且到尽头不能有两个以上出度为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;
    }
}

 

posted @ 2021-11-02 16:20  liyishui  阅读(21)  评论(0编辑  收藏  举报