zoukankan      html  css  js  c++  java
  • NYOJ 496 [巡回赛-拓扑排序]

    链接:click here

    题意:

    巡回赛

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:3
    描写叙述
    世界拳击协会(WBA)是历史最悠久的世界性拳击组织,孕育了众多的世界冠军,尤其是重量级,差点儿造就了大家耳熟能详的所有伟大的拳王。

    阿里、弗雷泽、福尔曼被称为“70年代重量级拳坛 三巨头”,是当之无愧的拳王,他们的得到的金腰带都刻有 WBA 字样。为庆贺世界拳击协会成立 50 周年,WBA 主席门多萨邀请 N 名拳击手进行了 M 场巡回比赛,每场比赛均可分出胜负,比赛过后组委会要对 N 名选手进行排序,对于每名拳手,必须满足该拳手所战胜过的对手所有排在其后才干对该排名惬意。
    现给出 M 场比赛的胜负关系,请你帮组委会决定是否可以唯一确定这种排名,使得全部的拳击手都惬意,若能唯一确定则输出终于排名。

    输入
    第一行给出測试数据的组数 T(0<T<30),对于每组測试数据,首先依次给出N(1<=N<=26),M(0<=M<=1000)分别表示拳手数和比赛数,拳手的姓名依次为从 A開始的前 N 个大写字母,接下 M 行给出每场比赛的比赛结果,每行由两个大写字母组成,两者之间有一空格。
    如 “A B”则表示在某场比赛中 A 战胜了 B。
    输出
    对于每组測试,若不存在唯一的排名序列则单行输出“No Answer”,若存在则按排名从高至低输出拳手的名字。
    例子输入
    3
    4 4
    A B
    A C
    B C
    C D
    4 4
    A B
    A C
    B D
    C D
    3 3
    A B
    B A
    A C
    
    例子输出
    ABCD
    No Answer
    No Answer
    来源
    【解题思路】:

       DFS实现拓扑排序

    代码:

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    using  namespace std;
    const int maxn =30;
    int t,n,m,V,i,j;
    int g[maxn],topo[maxn],G[maxn][maxn];
    bool DFS(int u)                           //DFS实现拓扑排序
    {
        g[u] = -1;                             //開始訪问该顶点
        for(int v=0; v<V; v++)
            if(G[u][v])
            {
                if(g[v]<0) return false;    //c[v]=-1代表正在訪问该定点(即递归调用DFS(u)正在帧栈中。尚未返回)
                else if(g[v]==0&&DFS(v)==0)return false;//(c[v]==0 && DFS(v)==false即当前顶点没有后即顶点时。
            }
        g[u]=1;                               //訪问结束
        topo[--t]=u;
        return true;
    }
    bool AOV_toposort()
    {
        t=V;
        memset(g,0,sizeof(g));
        for(int u = 0; u < V; u++)
            if(!g[u])
                if(!DFS(u))return false;
        return true;
    }
    int main()
    {
        //freopen("1.txt","r",stdin);
        //freopen("2.txt","w",stdout);
        int nca,i,m;
        char a[2],b[2];
        cin>>nca;
        while(nca--)
        {
            memset(G,0,sizeof(G));
            cin>>V>>m;
            for(i = 0; i < m; i++)
            {
                cin>>a>>b;
                G[(a[0]-'A')][(b[0]-'A')] = 1;
            }
            if(AOV_toposort())
            {
                bool flag= true;
                for(i=0; i<V-1; i++)
                    if(!G[topo[i]][topo[i+1]])
                    {
                        flag=false;
                        break;
                    }
                if(flag)
                {
                    for(i=0; i<V; i++)
                        printf("%c",topo[i]+'A');
                    puts("");
                }
                else
                    puts("No Answer");
            }
            else
                puts("No Answer");
        }
        return 0;
    }
    


  • 相关阅读:
    Ubuntu 16.04安装Guake Terminal终端(使用一键唤醒功能)
    MySQL查询count(*)、count(1)、count(field)的区别收集
    MySQL查询在一个表而不在另一个表中的数据
    Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用
    Spring mvc解析
    RestTemplate的一个请求过程,mark一下
    福袋开发迭代总结
    Rest分享
    写Markdown费事?Typora让你像写word一样行云流水,所见即所得。
    送你几个用起来很爽的Studio插件
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7137803.html
Copyright © 2011-2022 走看看