码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-01-08 22:50:01      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:

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;
}



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

标签:

原文地址:http://blog.csdn.net/winddreams/article/details/42531259

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!