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

 

posted on 2013-08-29 23:23  straw_berry  阅读(188)  评论(0编辑  收藏  举报