给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示),请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。 编程提示:满足合法有效的树结构的条件是: (1)图的连通分量个数不能大于1 (2)图中不能存在回边(可通过深度优先遍历来检查,如果一个顶点的邻接点之前已被访问过,且超过两个,则说明存在回边) 【输入形式】 顶点数 边数目 边列表 【输出形式】 True 或 False 【样例输入】 5 4 0 1 0 2 0 3 1 4 【样例输出】 True。用c语言实现的完整代码
时间: 2024-02-15 13:03:51 浏览: 73
leetcode261. 以图判树
```c
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 1000
typedef struct {
int data[MaxSize];
int top;
} Stack;
void InitStack(Stack *s) {
s->top = -1;
}
void Push(Stack *s, int x) {
s->data[++(s->top)] = x;
}
void Pop(Stack *s) {
if (s->top == -1) {
return;
}
--(s->top);
}
int Top(Stack *s) {
return s->data[s->top];
}
int Empty(Stack *s) {
return s->top == -1;
}
typedef struct {
int data[MaxSize];
int front, rear;
} Queue;
void InitQueue(Queue *q) {
q->front = q->rear = 0;
}
void EnQueue(Queue *q, int x) {
q->data[q->rear++] = x;
}
void DeQueue(Queue *q) {
++(q->front);
}
int Front(Queue *q) {
return q->data[q->front];
}
int EmptyQueue(Queue *q) {
return q->front == q->rear;
}
int find(int *f, int x) {
if (f[x] == x) {
return x;
}
return f[x] = find(f, f[x]);
}
int unionn(int *f, int x, int y) {
int fx = find(f, x);
int fy = find(f, y);
if (fx != fy) {
f[fx] = fy;
return 1;
}
return 0;
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
int *f = (int *) malloc(sizeof(int) * n);
for (int i = 0; i < n; ++i) {
f[i] = i;
}
int flag = 1;
for (int i = 0; i < m; ++i) {
int u, v;
scanf("%d%d", &u, &v);
if (unionn(f, u, v) == 0) {
flag = 0;
break;
}
}
if (flag == 0) {
printf("False\n");
return 0;
}
Stack s;
InitStack(&s);
int *vis = (int *) calloc(n, sizeof(int));
Push(&s, 0);
while (!Empty(&s)) {
int u = Top(&s);
Pop(&s);
vis[u] = 1;
int cnt = 0;
for (int i = 0; i < m; ++i) {
int u1, v1;
scanf("%d%d", &u1, &v1);
if (u == u1) {
++cnt;
if (vis[v1] == 0) {
Push(&s, v1);
}
} else if (u == v1) {
++cnt;
if (vis[u1] == 0) {
Push(&s, u1);
}
}
if (cnt > 2) {
printf("False\n");
return 0;
}
}
}
for (int i = 0; i < n; ++i) {
if (vis[i] == 0) {
printf("False\n");
return 0;
}
}
printf("True\n");
return 0;
}
```
阅读全文