Harry and Magical Computer
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≤100001≤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≤n1≤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 <stdio.h>
#include <string.h>
#define MAX 100+1
const int INF = 0x3f3f3f3f;
bool G[MAX][MAX];//用于判断有无连线
int in[MAX];//in[i] 表示i点的入度
bool topoSort(int n){//n个点
int cnt = 0;//作为指针作用
int k;
for(int t = 1;t<=n;t++){//n门课,需要找n遍
k = -1;
for(int i = 1;i<=n;i++){
if(in[i]==0){
k = i;
break;
}
}
//说明一趟下来没有找到入度为0的点,即存在环
if(k == -1) return false;
for(int i = 1;i<=n;i++){
if(G[k][i]){ //k --> i 即i为k课程的后续点
in[i]--;//那么直接后续点的入度-1
}
}
in[k] = -1;//用-1表示这个点被选过了
}
return true;
}
int main(){
int n,m;//n个点,m对关系
while(scanf("%d%d",&n,&m)!=EOF){
//初始化
memset(in,0,sizeof(in));
memset(G,false,sizeof(G));
int u,v;//v-->u 即v完成才能到u
for(int i = 0;i<m;i++){
scanf("%d%d",&u,&v);
if(!G[v][u]){
//v-->u即为u的入度+1,v的出度+1
G[v][u] = true;
in[u]++;
}
}
if(topoSort(n)){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}