|
您的代码存在几个主要问题导致运行时错误(段错误):
1. 没有使用数组存储图结构,导致无法处理输入数据
2. 变量使用混乱(如 link 和 ans 被反复覆盖)
3. 使用 goto 导致逻辑混乱
4. 未初始化关键数据结构
以下是修正后的代码(使用拓扑排序):
- #include <stdio.h>
- #include <string.h>
- #define MAXN 100010
- int head[MAXN], ver[2*MAXN], next[2*MAXN], tot;
- int deg[MAXN], queue[MAXN], vis[MAXN];
- void add(int u, int v) {
- ver[++tot] = v;
- next[tot] = head[u];
- head[u] = tot;
- deg[u]++;
- }
- int main() {
- int N;
- scanf("%d", &N);
-
- memset(head, 0, sizeof(head));
- memset(deg, 0, sizeof(deg));
- tot = 0;
-
- // 读入边并建图
- for (int i = 0; i < N; i++) {
- int a, b;
- scanf("%d %d", &a, &b);
- add(a, b);
- add(b, a);
- }
-
- // 将度为1的节点入队
- int front = 0, rear = 0;
- for (int i = 1; i <= N; i++) {
- if (deg[i] == 1) {
- queue[rear++] = i;
- }
- }
-
- // 拓扑排序
- while (front < rear) {
- int u = queue[front++];
- vis[u] = 1; // 标记为非环节点
-
- for (int i = head[u]; i; i = next[i]) {
- int v = ver[i];
- if (--deg[v] == 1) {
- queue[rear++] = v;
- }
- }
- }
-
- // 输出环上的节点(度>=2的节点)
- for (int i = 1; i <= N; i++) {
- if (!vis[i]) {
- printf("%d ", i);
- }
- }
- return 0;
- }
复制代码
关键修改:
1. 使用邻接表存储图结构(head/ver/next 数组)
2. 添加度数组 deg 记录每个节点的度数
3. 拓扑排序过程:
- 将所有度为1的节点入队(树节点)
- 依次移除度为1的节点并更新邻居度数
- 剩余度≥2的节点即为环上节点
4. 使用 vis 数组标记已处理节点
时间复杂度:O(N),适用于题目最大数据范围(10^5个点)
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|