hdu5154--Harry and Magical Computer(拓扑排序)

Harry and Magical Computer
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Appoint description: 

Description

In reward of being yearly outstanding magic student, Harry gets a magical computer. When the computer begins to deal with a process, it will work until the ending of the processes. One day the computer got n processes to deal with. We number the processes from 1 to n. However there are some dependencies between some processes. When there exists a dependencies (a, b), it means process b must be finished before process a. By knowing all the m dependencies, Harry wants to know if the computer can finish all the n processes.
 

Input

There are several test cases, you should process to the end of file. 
For each test case, there are two numbers n m on the first line, indicates the number processes and the number of dependencies. $1 \leq n \leq 100, 1 \leq m \leq 10000$ 
The next following m lines, each line contains two numbers a b, indicates a dependencies (a, b). $1 \leq a, b \leq n$
 

Output

Output one line for each test case. 
If the computer can finish all the process print "YES" (Without quotes). 
Else print "NO" (Without quotes).
 

Sample Input

     
     
3 2 3 1 2 1 3 3 3 2 2 1 1 3
 

Sample Output

     
     
YES NO

拓扑排序判断有无环

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std ;
int in[120] ;
int Map[120][120] ;
queue <int> que ;
int main()
{
	int n , m , u , v , i ;
	while( scanf("%d %d", &n, &m) != EOF )
	{
		while( !que.empty() )
			que.pop() ;
		memset(in,0,sizeof(in)) ;
		memset(Map,0,sizeof(Map)) ;
		while(m--)
		{
			scanf("%d %d", &u, &v) ;
			Map[v][u]++ ;
			in[u]++ ;
		}
		for(i = 1 ; i <= n ; i++)
			if( in[i] == 0 )
				que.push(i) ;
		while( !que.empty() )
		{
			u = que.front() ;
			que.pop() ;
			for(i = 1 ; i <= n ; i++)
			{
				if( Map[u][i] != 0 )
				{
					in[i] -= Map[u][i] ;
					Map[u][i] = 0 ;
					if( in[i] == 0 )
						que.push(i) ;
				}
			}
		}
		for(i = 1 ; i <= n ; i++)
			if( in[i] )
				break ;
		if( i <= n )
			printf("NO\n") ;
		else
			printf("YES\n") ;
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值