当前位置: 代码迷 >> 电脑整机及配件 >> hdu5154-Harry and Magical Computer(拓扑排序)
  详细解决方案

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

热度:509   发布时间:2016-04-29 02:40:43.0
hdu5154--Harry and Magical Computer(拓扑排序)

Harry and Magical Computer
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status
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 23 12 13 33 22 11 3
 

Sample Output

YESNO

拓扑排序判断有无环

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



  相关解决方案