九度OJ-1448:Legal or Not

  第一道应用拓补排序的题目,应用拓补排序判断有无环。谨记:目前(这句话是做完所有拓补排序的题后写的)接触过的拓补排序的应用只有两个:

  1.利用拓扑排序确定拓扑序列;2.在确定拓扑序列的过程中判断该有向图是否是无环图

题目描述:

ACM-DIY is a large QQ group where many excellent acmers get together. It is so harmonious that just like a big family. Every day,many "holy cows" like HH, hh, AC, ZT, lcc, BF, Qinz and so on chat on-line to exchange their ideas. When someone has questions, many warm-hearted cows like Lost will come to help. Then the one being helped will call Lost "master", and Lost will have a nice "prentice". By and by, there are many pairs of "master and prentice". But then problem occurs: there are too many masters and too many prentices, how can we know whether it is legal or not?We all know a master can have many prentices and a prentice may have a lot of masters too, it's legal. Nevertheless,some cows are not so honest, they hold illegal relationship. Take HH and 3xian for instant, HH is 3xian's master and, at the same time, 3xian is HH's master,which is quite illegal! To avoid this,please help us to judge whether their relationship is legal or not. Please note that the "master and prentice" relation is transitive. It means that if A is B's master ans B is C's master, then A is C's master.

输入:

The input consists of several test cases. For each case, the first line contains two integers, N (members to be tested) and M (relationships to be tested)(2 <= N, M <= 100). Then M lines follow, each contains a pair of (x, y) which means x is y's master and y is x's prentice. The input is terminated by N = 0.TO MAKE IT SIMPLE, we give every one a number (0, 1, 2,..., N-1). We use their numbers instead of their names.

输出:

For each test case, print in one line the judgement of the messy relationship.If it is legal, output "YES", otherwise "NO".

样例输入:
3 2
0 1
1 2
2 2
0 1
1 0
0 0
样例输出:
YES
NO
//适用条件:题目给的这张图只能有一个(弱)连通分量(但不要求强连通) 
#include <iostream>
#include <vector>
#include <queue>
#define MAXSIZE 300
using namespace std;
 
struct Edge{
    int thisNode;
    int nextNode;
    Edge(){
    }
    Edge(int thisNode,int nextNode){
        this->thisNode=thisNode;
        this->nextNode=nextNode;
    }
};
struct Vex{
};
struct Graph{
    int graphSize;
    vector<Edge> edge[MAXSIZE];
//  vector<Vex> vex;
    void initGraph(int graphSize){
        this->graphSize=graphSize;
        for (int i=0;i<graphSize;i++)
            edge[i].clear();
//      vex.clear();
    }
    void addEdge(int thisNode,int nextNode){
        edge[thisNode].push_back(Edge(thisNode,nextNode));
    }
};
 
int main(){
    int n,m;
    Graph graph;
    int inDegree[MAXSIZE];
    int cnt;
    queue<int> q,seq;
    int thisNode,nextNode;
    while (cin>>n>>m,n){
        //initiate
        graph.initGraph(n);
        for (int i=0;i<graph.graphSize;i++)
            inDegree[i]=0;
        while (!q.empty())
            q.pop();
        while (!seq.empty())
            seq.pop();
        cnt=0;
        //input & cal inDegree
        for (int i=0;i<m;i++){
            cin>>thisNode>>nextNode;
            graph.addEdge(thisNode,nextNode);
            inDegree[nextNode]++;
        }
        //initiate q
        for (int i=0;i<graph.graphSize;i++){
            if (inDegree[i]==0)
                q.push(i);
        }
        //Topological sorting 
        /*
        使用队列q作为线索,利用了"新出现的入度为0的点必定是由边的删除造成的"这一特性,对顶点进行遍历,较之自己的算法逻辑更优 
        使用了cnt计数器与顶点总数n比较来判定是否顶点皆已删除,较之自己的算法逻辑更优 
        */
        while(!q.empty()){
            int nowP=q.front();
            seq.push(nowP);//record the seq 
            q.pop();//del the vex
            cnt++;
            for (int i=0;i<graph.edge[nowP].size();i++){//traverse the edges & reduce inDegree
                int nextNode=graph.edge[nowP][i].nextNode;
                inDegree[nextNode]--;
                if (inDegree[nextNode]==0)
                    q.push(nextNode);
            }
            graph.edge[nowP].clear();//del the edges
        }
        //output
        cout<<(cnt==n?"YES":"NO")<<endl;
    }
    return true;
}
/**************************************************************
    Problem: 1448
    User: bit3125
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1524 kb
****************************************************************/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,根据提供的引用内容,我无法回答关于西北工业大学计算机考研真题在百度云上的问题。引用提供了一个关于字符串合并的样例输入和输出,而引用和引用提供了一些与西北工业大学计算机研究生的相关信息。但是,这些引用内容都没有提供与百度云相关的信息。如果您有关于其他方面的问题,我将很乐意为您提供帮助和回答。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [九度OJ 题目1471:合并符串](https://blog.csdn.net/SJF0115/article/details/8609716)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [2021西北工业大学考研历年真题](https://blog.csdn.net/weixin_42502288/article/details/118177726)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [undefined](undefined)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值