zoukankan      html  css  js  c++  java
  • 九度OJ 1450:产生冠军

    题目描述:

    有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。
    球赛的规则如下:
    如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。
    如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。
    根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。

    输入:

    输入含有一些选手群,每群选手都以一个整数n(n<1000)开头,后跟n对选手的比赛结果,比赛结果以一对选手名字(中间隔一空格)表示,前者战胜后者。如果n为0,则表示输入结束。

    输出:

    对于每个选手群,若你判断出产生了冠军,则在一行中输出“Yes”,否则在一行中输出“No”。

    样例输入:
    3
    Alice Bob
    Smith John
    Alice Smith
    5
    a c
    c d
    d e
    b e
    a d
    0
    样例输出:
    Yes
    No
    #include <iostream>
    #include <vector>
    #include <string>
    #include <queue>
    #define N 1002
    using namespace std;
    struct edge{
        int t;
    };
    
    string name[N];
    int size;
    int findRank(string x){
        for(int i = 0;i < size;i++){
            if(name[i] == x)return i;
        }
        name[size++] = x;
        return size - 1;
    }
    
    int main()
    {
        int n;
        int inDegree[N];
        queue<int> Q;
        vector<edge> graph[N];
        while(cin>>n){
            if(n == 0)break;
            size = 0;
            for(int i = 0;i < 1002;i++){
                graph[i].clear();
                inDegree[i] = 0;
            }
            for(int i = 0;i < n;i++){
                string tmp1,tmp2;
                cin>>tmp1>>tmp2;
                int a = findRank(tmp1);
                int b = findRank(tmp2);
                edge e;e.t = b;
                graph[a].push_back(e);
                inDegree[b]++;
            }
            while(!Q.empty())Q.pop();
            int p = 0;
            for(int i = 0;i < size;i++)
                if(inDegree[i] == 0){
                    Q.push(i);
                    p++;
                }
            if(p != 1){cout<<"No"<<endl;continue;}
            int cnt = 0;
            while(!Q.empty()){
                int newP = Q.front();
                Q.pop();
                cnt++;
                for(int j = 0;j < graph[newP].size();j++){
                    int to = graph[newP][j].t;
                    inDegree[to]--;
                    if(inDegree[to] == 0)Q.push(to);
                }
            }
            if(cnt == size)
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl;
        }
        return 0;
    }
  • 相关阅读:
    JSON解析
    [Git的常见使用方式]
    [二进制]原码,反码,补码
    [伪] 级联菜单,两级菜单
    [心得]Java开发中的小心得
    [纪录]仿IOS滚轮效果(竖直滑动选择器)
    web测试总结
    科目组2
    科目组
    凭证:条目视图,总账视图
  • 原文地址:https://www.cnblogs.com/starryxsky/p/7095602.html
Copyright © 2011-2022 走看看