int * newIntRaw(int n) { return (int *)malloc(sizeof(int) * n); } int * newInt(int n, int init) { int *p = newIntRaw(n+1); int i; for (i = 0; i <= n; ++i) p[i] = init; return p; }
structNode { std::vector<int>to; }nd[maxn]; typedefstruct { int e; int n; } Graph;
Graph * newGraph() { int n, e; int i; int u,v; Graph *g = (Graph *)malloc(sizeof(Graph)); scanf("%d %d %d", &n, &e, &k); g->n = n; g->e = e; for (i = 0; i < e; ++i) { scanf("%d %d", &u, &v); nd[u].to.push_back(v); nd[v].to.push_back(u); } return g; }
// ---------------------------solve----------------------- int *visited; int *father; int len; int k; bool ok=0; voiddfs(Graph *g, int s) { if (ok)return; visited[s] = 1; for (auto i:nd[s].to) { if (ok)break; if (visited[i] == 0) { father[i] = s; dfs(g, i); } elseif (visited[i] == 1 && i != father[s]) { std::vector<int>vc; int tmp = s; vc.push_back(i); len = 1; while (tmp != i) { len++; vc.push_back(tmp); tmp = father[tmp]; } if (len > k&&!ok) { ok = 1; printf("%d\n", len); for (auto c : vc) printf("%d ", c); printf("\n"); } } } visited[s] = 2; // 避免重复计算环 }
voidfindRing(Graph *g) { int i; visited = newInt(g->n, 0); father = newInt(g->n, -1); for (i = 0; i < g->n; ++i) if (ok)return; if (visited[i] == 0) dfs(g, i); }