hdu 5154 Harry and Magical Computer

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5154

题意分析:有向图问题,要求判断是否存在环。 发现并查集竟然也能处理有向图问题~~

/*Harry and Magical Computer

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


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
 

Source
BestCoder Round #25
 
*/
#include <cstdio>
#include <cstring>
const int maxn = 1000 + 10;
int n, m, p[maxn];
int find(int x, int y)
{
    if(p[y] == x) return 1;
    if(p[y] == y) return 0;
    find(x, p[y]);
}

int main()
{
    int a, b;
    while(~scanf("%d%d", &n, &m)){
        int flag = 0;
        for(int i = 1; i <= n; i++) p[i] = i;
        for(int i = 0; i < m; i++){
            scanf("%d%d", &a, &b);
            if(find(a, b)) flag = 1;
            else p[a] = b;
        } 
        if(!flag) printf("YES
");
        else printf("NO
"); 
    }
    return 0;
}