hdu 3342 Legal or Not

来源:互联网 发布:淘宝上买不到的东西 编辑:程序博客网 时间:2024/05/29 18:34

题目链接:点这里

Problem Description

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.

Input

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.

Output

For each test case, print in one line the judgement of the messy relationship.

If it is legal, output “YES”, otherwise “NO”.

Sample Input

3 20 11 22 20 11 00 0

Sample Output

YESNO

【题意】

n个点m个关系,每个关系的描述都是两个数字,表示
前者是后者的师傅,问你这n个关系是否有错误,如果存在师傅徒弟关系不符合常理的就输出NO,否则就输出YES。不符合常理的意思是:不能存在师傅的师傅是自己徒弟这种不符合正常人常识的事。

【分析】

其实说直白点就是问你有向图是否存在回路了。用拓扑排序就可以做,然后不断的删点删边,如果删光了点还有边就说明存在回路,那就输出NO就行。

【代码】

#include<iostream>#include<cstdio>#include<cstring>#include<string.h>#include<algorithm>#include<vector>#include<cmath>#include<stdlib.h>#include<time.h>#include<stack>#include<set>#include<map>#include<queue>#include<sstream>using namespace std;#define rep0(i,l,r) for(int i = (l);i < (r);i++)#define rep1(i,l,r) for(int i = (l);i <= (r);i++)#define rep_0(i,r,l) for(int i = (r);i > (l);i--)#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)#define MS0(a) memset(a,0,sizeof(a))#define MS1(a) memset(a,-1,sizeof(a))#define MSi(a) memset(a,0x3f,sizeof(a))#define sin1(a) scanf("%d",&(a))#define sin2(a,b) scanf("%d%d",&(a),&(b))#define sll1(a) scanf("%lld",&(a))#define sll2(a,b) scanf("%lld%lld",&(a),&(b))#define sdo1(a) scanf("%lf",&(a))#define sdo2(a,b) scanf("%lf%lf",&(a),&(b))#define inf 0x3f3f3f3f#define lson i<<1,l,mid#define rson ((i<<1)|1),mid+1,r#define uint unsigned inttypedef pair<int,int> PII;#define A first#define B second#define pb push_back#define MK make_pair#define ll long longtemplate<typename T>void read1(T &m){    T x=0,f=1;    char ch=getchar();    while(ch<'0'||ch>'9')    {        if(ch=='-')f=-1;        ch=getchar();    }    while(ch>='0'&&ch<='9')    {        x=x*10+ch-'0';        ch=getchar();    }    m = x*f;}template<typename T>void read2(T &a,T &b){    read1(a);    read1(b);}template<typename T>void read3(T &a,T &b,T &c){    read1(a);    read1(b);    read1(c);}template<typename T>void out(T a){    if(a>9) out(a/10);    putchar(a%10+'0');}template<typename T>void outn(T a){    if(a>9) out(a/10);    putchar(a%10+'0');    puts("");}using namespace std;///---------------------------------------------------------------------------------const int maxm = 105;vector<int>G[maxm];int in[maxm];int poi,edge;bool ans(void){    rep0(i,0,poi)    {        rep0(j,0,poi)        {            if(in[j]==0)            {                in[j]=-1;                rep0(k,0,G[j].size())                {                    in[G[j][k]]--;                }            }        }    }    rep0(i,0,poi)    {        if(in[i]>0) return false;    }    return true;}int main(){//    freopen("in.txt","r",stdin);    while(read2(poi,edge),poi||edge)    {        memset(in,0,sizeof(in));        rep0(i,0,poi) G[i].clear();        int from,to;        while(edge--)        {            read2(from,to);            in[to]++;            G[from].pb(to);        }        puts(ans()?"YES":"NO");    }    return 0;}