题目链接: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\n"); else printf("NO\n"); } return 0; }
hdu 5154 Harry and Magical Computer
原文:http://www.cnblogs.com/ACFLOOD/p/4310416.html