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

Harry and Magical Computer
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit  Status
Appoint description:  System Crawler  (2015-01-06)

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(拓扑排序))