A Simple problem

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2497

题意:给出顶点数,边数及节点s,判断s是否包含在所有的环中;

思路:并查集的应用,在除s节点以外的节点中,取出有公共源点的节点放到一个集合中,若还能形成环说明s不能经过所有的环,否则s能经过所有的环;

 1 #include<stdio.h>

 2 #include<string.h>

 3 

 4 int set[10010],n,m,s;

 5 

 6 int find(int x)

 7 {

 8     if(set[x] != x)

 9         set[x] = find(set[x]);

10     return set[x];

11 }

12 

13 int main()

14 {

15     int u,v;

16     while(~scanf("%d %d %d",&n,&m,&s))

17     {

18         int flag = 1;

19         for(int i = 1; i <= n; i++)

20             set[i] = i;

21 

22         for(int i = 1; i <= m; i++)

23         {

24             scanf("%d %d",&u,&v);

25             if(u != s && v != s)

26             {

27                 int tu = find(u);

28                 int tv = find(v);

29                 if(tu == tv)

30                     flag = 0;

31                 set[tu] = tv;

32             }

33         }

34         if(flag == 1)

35             printf("YES\n");

36         else printf("NO\n");

37     }

38     return 0;

39 }
View Code

 

你可能感兴趣的:(simple)