Harry and Magical Computer
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 499 Accepted Submission(s): 233
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
#include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 100001 const int inf=0x7fffffff; //无限大 int map[101][101]; int vis[101]; int flag[101]; int main() { int n,m; while(cin>>n>>m) { memset(map,0,sizeof(map)); memset(vis,0,sizeof(vis)); memset(flag,0,sizeof(flag)); int a,b; for(int i=0;i<m;i++) { cin>>a>>b; map[b-1][a-1]=1; flag[a-1]=1; } queue<int> q; for(int i=0;i<n;i++) { if(flag[i]==0) { q.push(i); vis[i]=1; } } int now; int next; while(!q.empty()) { now=q.front(); for(int i=0;i<n;i++) { if(map[now][i]==1) { if(vis[i]==1) continue; q.push(i); vis[i]=1; } } q.pop(); } int flag1=0; for(int i=0;i<n;i++) { if(vis[i]==0) { flag1=1; break; } } if(flag1==1) cout<<"NO"<<endl; else cout<<"YES"<<endl; } }