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