http://acm.hdu.edu.cn/showproblem.php?pid=3560
Graph’s Cycle Component 使用广度优先判断是否连通,环的每个顶点的度均为2,判断连通分量的每个顶点的度是否为2来判断是否为环。使用深度优先栈溢出,亦可以使用并查集判断是否连通。
- #include<stdio.h>
- #include<stdlib.h>
- #define N 100005
- typedef struct arc_node{
- int adjvex;
- struct arc_node *next;
- }arc_node;
- typedef struct vex_node{
- int color;
- int degree; //度
- arc_node *first_arc;
- }vex_node;
- vex_node vertex[N];
- int flag[N]; //标记第i个顶点是否被访问过
- int queue[N]; //广度优先所需要的队列
- int init(int n)
- {
- int i;
- for (i = 0; i < n; i++)
- {
- vertex[i].color = 0;
- vertex[i].degree = 0;
- vertex[i].first_arc = NULL;
- }
- return 1;
- }
- int insert(int u, int v)
- {
- arc_node *p;
- p = (arc_node *)malloc(sizeof(arc_node));
- if (!p)
- exit(0);
- p->adjvex = v;
- p->next = vertex[u].first_arc;
- vertex[u].first_arc = p;
- vertex[u].degree++;
- p = (arc_node *)malloc(sizeof(arc_node));
- if (!p)
- exit(0);
- p->adjvex = u;
- p->next = vertex[v].first_arc;
- vertex[v].first_arc = p;
- vertex[v].degree++;
- return 1;
- }
- int bfs(int u, int count)
- {
- arc_node *p;
- int begin, end;
- int tag; //tag为0表示该连通分量为环,为1表示该连通分量不是环
- begin = 0;
- end = 0;
- queue[end++] = u;
- flag[u] = 1;
- if (vertex[u].degree == 2)
- tag = 0;
- else
- tag = 1;
- while (begin < end)
- {
- u = queue[begin++];
- p = vertex[u].first_arc;
- while (p)
- {
- if (flag[p->adjvex] == 0)
- {
- queue[end++] = p->adjvex;
- flag[p->adjvex] = 1;
- if (vertex[p->adjvex].degree != 2)
- tag = 1; //
- }
- p = p->next;
- }
- }
- if (tag == 0)
- return 1;
- else
- return 0;
- }
- void main()
- {
- int m, n;
- int u, v;
- int i;
- int count, num;
- // freopen("input.txt", "r", stdin);
- while (scanf("%d%d", &n, &m) != EOF && !(n == 0 && m == 0))
- {
- init(n);
- for (i = 0; i < m; i++)
- {
- scanf("%d%d", &u, &v);
- insert(u, v);
- }
- for (i = 0; i < n; i++)
- {
- flag[i] = 0;
- }
- count = 0; //count用于标记是第几个连通分量
- num = 0; //num 用于统计环的个数
- for (i = 0; i < n; i++)
- {
- if (flag[i] == 0)
- {
- count++;
- if (bfs(i, count) == 1)
- num++;
- }
- }
- printf("%d %d\n", count, num);
- }
- }
转载于:https://blog.51cto.com/2853126/637899