程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu5154--Harry and Magical Computer(拓撲排序)

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

編輯:C++入門知識

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 2
3 1
2 1
3 3
3 2
2 1
1 3 

Sample Output

 YES
NO 

拓撲排序判斷有無環

#include 
#include 
#include 
#include 
using namespace std ;
int in[120] ;
int Map[120][120] ;
queue  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;
}



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved