タイトル説明
ACM-DIYは、多くの優れたacmersが集まる大規模なQQグループです。それだけで大きな家族のようになるように調和しています。毎日、多くのHH、HH、AC、ZT、LCC、BF、Qinzのような「聖なる牛」などのチャットでは、オンラインで自分のアイデアを交換します。誰かが質問を持っている場合は、失われたような多くの温かい心を持った牛は助けに来ます。そして、助けされている一つは「マスター」ロストを呼び出します、そしてロストがいい「プレンティス」を持つことになります。とによって、「マスターとプレンティス」の多くのペアがあります。しかし、その後、問題が発生します。あまりにも多くのマスターとあまりにも多くのprenticesがあり、どのように我々はそれが合法であるかどうかを知ることができますか?
我々は、すべてのマスターは、多くのprenticesを持つことができ、プレンティスがあまりにもマスターの多くを持っていることを知って、それは法的です。それにもかかわらず、いくつかの牛は、彼らが違法な関係を保持するので、正直ではありません。一瞬HHと3xianを取り、HHは同時に、3xianのマスターであると、3xianは非常に違法であるHHのマスター、です!これを避けるために、彼らの関係は法的であるかどうかを判定する私たちを助けてください。
「マスターとプレンティス」関係が推移的であるとしてくださいノート。これは、AがBのマスターであるANS BはCのマスターである場合、AはCのマスターであることを意味しています。入力形式
入力はいくつかのテストケースで構成されています。各場合について、最初の行は、2つの整数を含む、N(メンバーが試験される)とM(関係が試験される)(2 <= N、M <= 100)。その後、M行が各手段xがyのマスターである(X、Y)の対を含み、YはXのプレンティスである、に従います。入力は、N = 0で終了し
ITはSIMPLEを作るために、私たちは一人一人を与える数(0、1、2、...、N-1)。私たちは、彼らの数字の代わりに、自分の名前を使用します。出力フォーマット
各テストケースの場合は、1行に厄介な関係の判断を印刷します。
それが合法である場合は、出力「YES」、そうでない場合は「NO」。サンプル入力
3 2
0 1
1 2
2 2
0 1
1 0
0 0サンプル出力
YES
NO
分析
有向グラフN所与の点の影響を受けるが、トポロジカルソートmがエッジか否かを判断します。
それはトポロジカルに代表リングをソートすることができないかどうかを判断するためにストレートのテンプレート。
ソース
#include <bits/stdc++.h>
#define MAXN 105
using namespace std;
struct Edge{
int v,next;
Edge(){};
Edge(int _v,int _next){
v=_v,next=_next;
}
}edge[MAXN];
int EdgeCount,head[MAXN];
int n,m,in[MAXN];
void addEdge(int u,int v)
{
edge[++EdgeCount]=Edge(v,head[u]);
head[u]=EdgeCount;
}
bool TopSort()
{
queue<int> q;
for(int i=0;i<n;i++)
if(!in[i])q.push(i);
int cnt=0;
while(!q.empty()){
int u=q.front();
q.pop();
cnt++;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
in[v]--;
if(!in[v])q.push(v);
}
}
if(cnt!=n)return false;
return true;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&n){
EdgeCount=0;
for(int i=0;i<n;i++)head[i]=in[i]=0; //初始化
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
in[v]++;
addEdge(u,v);
}
if(TopSort())printf("YES\n");
else printf("NO\n");
}
}