树的重心

    科技2022-07-13  130

    #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <string> #include <cstdio> #include <string.h> #include <vector> #include <cmath> #include <map> #include <cstdlib> using namespace std; #define INFTY (1 << 30) #define RG register int #define ll long long #define MAX 20000+5 #define REP(i, a, b) for (register int i = (a); i < (b); i++) int n, m, son[MAX], id[MAX], p[MAX],mini=INFTY; vector<int> G[MAX]; int dfs(int u, int from) { int maxn=0; son[u] = 0;//作为一个树来讲,它本身不能算是它的子节点 for (int i = 0; i < G[u].size(); i++) { if (G[u][i] == from) continue; son[u] += dfs(G[u][i], u); //if(u==1) // printf("%d",G[u][i]); maxn=max(maxn,son[G[u][i]]+1); } p[u]=max(maxn,n-son[u]-1); mini=min(p[u],mini); return son[u]+1;//但是返回的时候可以算 } void addtree(int u, int v) { G[u].push_back(v); G[v].push_back(u); } int main() { int T; scanf("%d", &T); while (T--) { int a, b; scanf("%d", &n); for (int i = 0; i < n - 1; i++) { scanf("%d%d", &a, &b); addtree(a, b); } mini=INFTY; memset(p,0,sizeof(p)); dfs(1, -1); int k = 0; for (int i = 1; i <= n; i++) { if (p[i] == mini) { id[k++] = i; } } printf("%d %d\n",id[0],mini); for(int i=1;i<=n;i++) G[i].clear(); } //system("pause"); return 0; }

    一共改了一天多,出错点挺多的 1、求去掉每个节点后产生的连通块数目,最好放在DFS里面求,这样子不会出现从儿子又求到父亲节点的情况 2、对于多组测试数据,且又存在全局变量的情况下,一定要记得初始化

    Processed: 0.008, SQL: 8