題目地址:POJ 1655 樹的重心定義為:找到一個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹盡可能平衡. 樹的重心可以用樹形DP快速的找出來。 代碼如下:
#include #include #include #include #include #include #include #include #include #include using namespace std; #define LL __int64 #define pi acos(-1.0) //#pragma comment(linker, "/STACK:1024000000") #define root 1, n, 1 #define lson l, mid, rt<<1 #define rson mid+1, r, rt<<1|1 const int mod=1e9+7; const int INF=0x3f3f3f3f; const double eqs=1e-9; const int MAXN=20000+10; struct node { int v, next; }edge[MAXN<<1]; int head[MAXN], cnt, ans, min1, n; int sum[MAXN]; void add(int u, int v) { edge[cnt].v=v; edge[cnt].next=head[u]; head[u]=cnt++; } void init() { memset(head,-1,sizeof(head)); cnt=0; min1=INF; } void dfs(int u, int fa) { int max1=0, i, tot=0; sum[u]=1; for(i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(v==fa) continue ; dfs(v,u); sum[u]+=sum[v]; max1=max(max1,sum[v]); tot+=sum[v]; } max1=max(max1,n-tot-1); if(min1>max1){ min1=max1; ans=u; } } int main() { int t, u, v, i; scanf("%d",&t); while(t--){ scanf("%d",&n); init(); for(i=1;i
首先對於初學的,帶大家認識 cocos2d-x 中坐標系的幾
C++卷積神經網絡實例:tiny_cnn代碼詳解(7)——f
C++學習筆記13:運算符重載(賦值操作符2),學習筆記操作
線程間的同步概述 1.前言 前面幾篇文章著重介紹了多線
Codeforces Round #290 (Div. 2)
Parade Show Time Limit: 2