模板0分求助

P3388 【模板】割点(割顶)

@[__皮娃__](/space/show?uid=104241) `if(f == -1 && child < 2) isc[x] = 0;` 这里错了吧
by ZTL_UwU @ 2019-06-03 13:56:39


为什么呢?(老师的模板这样写的)
by piuke @ 2019-06-03 13:58:02


好吧变成30分了 ```cpp #include <cmath> #include <cstdio> #include <vector> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int MAXN = 20001; int n, m; vector<int> G[MAXN]; int dfn[MAXN], low[MAXN], k; bool isc[MAXN]; inline void init() { memset(G, 0, sizeof G); memset(dfn, 0, sizeof dfn); memset(low, 0, sizeof low); k = 0; memset(isc, 0, sizeof isc); scanf("%d%d", &n, &m); for(int i = 1; i <= m; i++) { int u, v; scanf("%d %d", &u, &v); G[u].push_back(v); G[v].push_back(u); } } #define Min(a, b) ( a < b ? a : b ) inline void Tarjan(int x, int f) { dfn[x] = low[x] = ++k; int child = 0; for(int i = 0; i < int(G[x].size()); i++) { int v = G[x][i]; if(!dfn[v]) { child++; Tarjan(v, x); if(low[v] >= dfn[x]) isc[x] = 1; low[x] = Min(low[x], low[v]); } else low[x] = Min(low[x], dfn[v]); } if(f == -1 && child < 2) isc[x] = 0; } int main() { init(); for(int i = 1; i <= n; i++) if(!dfn[i]) Tarjan(1, -1); int t = 0; for(int i = 1; i <= n; i++) if(isc[i]) t++; printf("%d\n", t); for(int i = 1; i <= n; i++) if(isc[i]) printf("%d ", i), t++; } ```
by piuke @ 2019-06-03 14:14:50


|