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 }