//这个程序能得90分,其中第九组数据应该输出55,但这个程序输出56,不知道为什么。 #include #include int n, p, maxd; int w[400]; typedef struct Edge { int from, to; Edge *next; Edge(int f, int t, Edge *n = 0) : from(f), to(t), next(n) {} } * lpEdge; #define addEdge(Gp, x, y) (Gp)[x] = new Edge((x), (y), (Gp)[x]); lpEdge G1[302], G[302], Dep[302]; bool vis[302]; void build(int id) { vis[id] = true; for (lpEdge cur = G1[id]; cur; cur = cur->next) if (!vis[cur->to]) { addEdge(G, id, cur->to); build(cur->to); } } int getWeight(int id) { if (~w[id]) return w[id]; else { int cnt = 1; for (lpEdge cur = G[id]; cur; cur = cur->next) cnt += getWeight(cur->to); return w[id] = cnt; } } void getDepth(int id, int d) { if (id > maxd) maxd = id; addEdge(Dep, d, id); for (lpEdge cur = G[id]; cur; cur = cur->next) getDepth(cur->to, d + 1); } void setSafe(int id) { vis[id] = true; for (lpEdge cur = G[id]; cur; cur = cur->next) setSafe(cur->to); } int main() { memset(w, -1, sizeof(w)); scanf("%d%d", &n, &p); for (int i = 0, a, b; i < p; i++) { scanf("%d%d", &a, &b); addEdge(G1, a, b); addEdge(G1, b, a); } build(1); getWeight(1); getDepth(1, 0); memset(vis, 0, sizeof(vis)); int safeCnt = 0; for (int i = 1, maxn, maxid; i <= maxd; i++) { maxn = maxid = 0; for (lpEdge cur = Dep[i]; cur; cur = cur->next) if (!vis[cur->to] && w[cur->to] > maxn) maxn = w[maxid = cur->to]; safeCnt += maxn; setSafe(maxid); } printf("%d", n - safeCnt); return 0; }