您的位置:首页 > 其它

hdu 5154 Harry and Magical Computer

2015-03-03 10:53 465 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: