标签:
|
Harry and Magical ComputerTime 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 }
hdu 5154 -- Harry and Magical Computer
标签:
原文地址:http://www.cnblogs.com/ubuntu-kevin/p/4244117.html