hdu 5154 -- Harry and Magical Computer

 

Harry and Magical Computer

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 641    Accepted Submission(s): 295


Problem 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≤n≤100,1≤m≤10000
The next following m lines, each line contains two numbers a b, indicates a dependencies (a, b). 1≤a,b≤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
 

思路: 用拓扑排序求解.

 

 1 /*======================================================================
 2  *           Author :   kevin
 3  *            Email :   zerocode.kevin@gmail.com
 4  *         Filename :   HarryAndMagicalComputer.cpp
 5  *       Creat time :   2015-01-23 09:17
 6  *      Description :
 7 ========================================================================*/
 8 #include <iostream>
 9 #include <algorithm>
10 #include <cstdio>
11 #include <cstring>
12 #include <queue>
13 #include <cmath>
14 #define clr(a,b) memset(a,b,sizeof(a))
15 #define INF 0x7f7f7f7f
16 #define M 10005
17 using namespace std;
18 inline int min_32(int (a),int (b)){return (a)<(b)?(a):(b);}
19 inline int max_32(int (a),int (b)){return (a)>(b)?(a):(b);}
20 inline long long min_64(long long (a),long long (b)){return (a)<(b)?(a):(b);}
21 inline long long max_64(long long (a),long long (b)){return (a)>(b)?(a):(b);}
22 int head[M],in[M];
23 struct Node{
24     int to,next;
25 }node[M];
26 void addEdges(int i,int j,int k)
27 {
28     node[k].to = j;
29     node[k].next = head[i];
30     head[i] = k;
31 }
32 int slove(int n)
33 {
34     queue<int>que;
35     for(int i = 1; i <= n; i++){
36         if(in[i] == 0){
37             que.push(i);
38         }
39     }
40     int k,cnt = 0;
41     while(!que.empty()){
42         int t = que.front();
43         que.pop();
44         cnt++;
45         for(k = head[t]; k != -1; k = node[k].next){
46             if(--in[node[k].to] == 0){
47                 que.push(node[k].to);
48             }
49         }
50     }
51     if(cnt == n){
52         return 1;
53     }
54     return 0;
55 }
56 int main(int argc,char *argv[])
57 {
58     int n,m;
59     while(scanf("%d%d",&n,&m)!=EOF){
60         clr(head,-1);
61         clr(in,0);
62         int a,b;
63         for(int i = 0; i < m; i++){
64             scanf("%d%d",&a,&b);
65             addEdges(b,a,i);
66             in[a]++;
67         }
68         if(slove(n)){
69             printf("YES\n");
70         }
71         else{
72             printf("NO\n");
73         }
74     }
75     return 0;
76 }
View Code

 

posted @ 2015-01-23 14:19  ZeroCode_1337  阅读(305)  评论(0)    收藏  举报