拓扑排序hdu 3342 Legal or Not

来源:互联网 发布:三星电话交换机编程 编辑:程序博客网 时间:2024/06/06 05:41

Legal or Not

TimeLimit: 2000/1000 MS(Java/Others)    MemoryLimit: 32768/32768 K (Java/Others)
Total Submission(s):1446    AcceptedSubmission(s): 603


Problem Description
ACM-DIY is a large QQ group where many excellent acmers gettogether. It is so harmonious that just like a big family. Everyday,many "holy cows" like HH, hh, AC, ZT, lcc, BF, Qinz and so onchat on-line to exchange their ideas. When someone has questions,many warm-hearted cows like Lost will come to help. Then the onebeing helped will call Lost "master", and Lost will have a nice"prentice". By and by, there are many pairs of "master andprentice". But then problem occurs: there are too many masters andtoo many prentices, how can we know whether it is legal ornot?

We all know a master can have many prentices and a prentice mayhave a lot of masters too, it's legal. Nevertheless,some cows arenot so honest, they hold illegal relationship. Take HH and 3xianfor instant, HH is 3xian's master and, at the same time, 3xian isHH's master,which is quite illegal! To avoid this,please help us tojudge whether their relationship is legal ornot. 

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'smaster.
 

Input
The input consists of several test cases. For each case, the firstline 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 pairof (x, y) which means x is y's master and y is x's prentice. Theinput 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 messyrelationship.
If it is legal, output "YES", otherwise "NO".
 

Sample Input
32 
01 
12 
22 
01 
10 
00
 

Sample Output
YES 
NO
这道题主要就是判断是否能拓扑排序(就是不能构成环),能的话就输出YES,不能侧输出NO。
#include<stdio.h>
#include<string.h>
intflag=1;
intmap[110][110];
void topology(int n)
{
intmark[510];
memset(mark,0,sizeof(mark));
inti,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
if(map[i][j]==1)
mark[j]++;
}
for(i=0;i<n;i++)
{
j=0;
while(mark[j]!=0) j++;
if(j>=n) 
{
flag=0;
break;
}
mark[j]=-1;
for(k=0;k<n;k++)
if(map[j][k]==1)
mark[k]--;
}
if(flag==1)
printf("YES\n");
elseprintf("NO\n");
}
intmain()
   

intn,i,m;
intstart,end;
while(scanf("%d%d",&n,&m)!=EOF)
if(n==0&&m==0)break;
memset(map,0,sizeof(map));
flag=1;
for(i=0;i<m;i++)
{
scanf("%d%d",&start,&end);
map[start][end]=1;
}
      topology(n);

}
 return 0;
}

 

 

原创粉丝点击