洛谷 P3478 [POI2008]STA-Station(bzoj P1131 [POI2008]STA-Station)

来源:互联网 发布:java项目开发流程图 编辑:程序博客网 时间:2024/05/22 05:38

传送门

这题必须要吐槽!!!

首先树形dp先求以1为根的深度和,然后由父亲节点转移到儿子节点,也就是除了儿子节点以下包括儿子节点的其他节点深度减1,儿子节点以下包括儿子节点的其他节点深度加一(画个图很容易看出,实在不行看popoqqq的博客,解释的很清楚),然后o(1)转移。状态转移方程:f[x]=f[fa[x]]+n-2*son[x],son[x]就是x节点包括自己的所有儿子节点个数,fa[x]就是x节点的父亲。

然后就是吐槽!!!:首先要卡long long,wa两发,然后注意存图数组开两倍,因为树无向,re两发,最后最令人气愤的是有多个节点最大要输出编号最小的那个!!神tm英文题面没看就看了看中文题面然后他又不说。。然后无限wa!!!垃圾题目!!

代码:

#include<iostream>#include<stdio.h>using namespace std;const int Maxn=1000005;struct node{int v;int next;}t[2*Maxn];int head[Maxn*2],deep[Maxn*2],son[Maxn*2];long long maxn,f[Maxn*2];int cnt,n,maxi=1;int Insert(int u,int v){cnt++;t[cnt].v=v;t[cnt].next=head[u];head[u]=cnt;}int dfs_deep(int u,int d){f[1]+=d;deep[u]=d;for(int i=head[u];i;i=t[i].next)if(deep[t[i].v]==0&&t[i].v!=1)son[u]+=dfs_deep(t[i].v,d+1);return son[u];}void dfs_f(int u){for(int i=head[u];i;i=t[i].next)if(f[t[i].v]==0){f[t[i].v]=f[u]+(n-son[t[i].v])-son[t[i].v];dfs_f(t[i].v);}} int main(){int u,v;scanf("%d",&n);for(int i=1;i<=n-1;i++){scanf("%d%d",&u,&v);Insert(u,v);Insert(v,u);}for(int i=1;i<=n;i++)son[i]=1;dfs_deep(1,0);maxn=f[1];dfs_f(1);for(int i=1;i<=n;i++)if(maxn<f[i]){maxi=i;maxn=f[i];}printf("%d",maxi);return 0;}


原创粉丝点击