題目地址: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
我不知道各位,一提起C++,第一感覺是什麼?而
Language:Default Stars
最近要用MFC開發一個界面,裡面有一個需求就是生成一個與可執
1038 - Race to 1 Again
第9章 順序容器9.1 順序容器概述選擇容器的基本原則:9.
題目描述 給你兩個數n,k,請求出的值。