二次联通门 : cogs 944. [東方S3] 藤原妹红

/*
cogs 944. [東方S3] 藤原妹红 最小生成树 + 树形dp 首先对原图跑最下生成树 后建出一棵树
在树上进行dp
先走到叶子节点, 顺便处理出距离 最终回溯时更新答案
*/
#include <algorithm>
#include <cstdio> #define INF 1e30 void read (int &now)
{
register char word = getchar ();
for (now = ; word < '' || word > ''; word = getchar ());
for (; word >= '' && word <= ''; now = now * + word - '', word = getchar ());
} #define Max 300010 int N, M;
#define Online struct Edge_Data
{
int from;
int to;
double value; bool operator < (const Edge_Data &now) const
{
return this->value < now.value;
}
}; double Max_dis = INF;
int Answer; class Tree_Dp_Type
{
private : int __to[Max], count[Max];
double __value[Max];
int __next[Max]; int edge_list[Max];
int Edge_Count; double dis[Max];
double Sum; public : Tree_Dp_Type ()
{
Sum = ;
} inline void Insert_edge (int from, int to, double value)
{
Edge_Count ++;
__to[Edge_Count] = to;
__next[Edge_Count] = edge_list[from];
edge_list[from] = Edge_Count; Edge_Count ++;
__to[Edge_Count] = from;
__value[Edge_Count] = __value[Edge_Count - ] = value;
__next[Edge_Count] = edge_list[to];
edge_list[to] = Edge_Count; count[from] ++;
count[to] ++;
Sum += value;
} double Dfs (int now, int father)
{
double avg = Sum / (double) count[now];
double res = , __res = ; for (int i = edge_list[now]; i; i = __next[i])
{ if (__to[i] == father)
continue; dis[__to[i]] = __value[i] + Dfs (__to[i], now);
res += (dis[__to[i]] - avg) * (dis[__to[i]] - avg);
__res += dis[__to[i]];
}
res += (Sum - __res - avg) * (Sum - __res - avg); if (count[now] != && (res < Max_dis || (res == Max_dis && Answer > now)))
{
Answer = now;
Max_dis = res;
} return __res;
}
}; Tree_Dp_Type Dp; class Min_Out_Tree_Type
{ private : int father[Max]; int edge_list[Max];
int Edge_Count; Edge_Data edge[Max * ]; public : void Prepare (int Limit)
{/*
register int i;
for (i = 1; i <= Limit; i += 3)
{
father[i] = i;
father[i + 1] = i + 1;
father[i + 2] = i + 2;
}
if (i > Limit)
for (i -= 3; i > N; i ++)
father[i] = i;
*/
for (register int i = ; i <= Limit; i ++)
father[i] = i;
} int Find (int x)
{
return father[x] == x ? x : father[x] = this->Find (father[x]);
} inline void Insert_edge (int from, int to, double key)
{
Edge_Count ++;
edge[Edge_Count].from = from;
edge[Edge_Count].to = to;
edge[Edge_Count].value = key;
} void Get_Min_Value_Tree ()
{
std :: sort (edge + , edge + M + ); int Count = ;
for (register int i = , x, y; i <= M; i ++)
{
x = this->Find (edge[i].from);
y = this->Find (edge[i].to); if (x != y)
{
father[x] = y;
Count ++;
Dp.Insert_edge (edge[i].from, edge[i].to, edge[i].value);
}
if (Count == N - )
break;
}
}
}; Min_Out_Tree_Type Get_Tree; int main (int argc, char *argv[])
{ #ifdef Online freopen ("mokou.in", "r", stdin);
freopen ("mokou.out", "w", stdout); #endif read (N);
read (M); int x, y;
double z;
Get_Tree.Prepare (N); for (int i = ; i <= M; i ++)
{
read (x);
read (y);
scanf ("%lf", &z);
Get_Tree.Insert_edge (x, y, z);
} Get_Tree.Get_Min_Value_Tree (); Dp.Dfs (, ); printf ("%d", Answer); return ;
}

cogs 944. [東方S3] 藤原妹红的更多相关文章

  1. cogs 943. [東方S3] 铃仙•优昙华院•稻叶

    二次联通门 : cogs 943. [東方S3] 铃仙•优昙华院•稻叶 /* cogs 943. [東方S3] 铃仙·优昙华院·稻叶 概率dp 貌似做麻烦了 邻接矩阵和链式前向星都用上了... dp[ ...

  2. COGS 942. [東方S3] 比那名居天子

    Problem 1 比那名居天子(tenshi.cpp/c/pas) 题目描述 在幻想乡,比那名居天子是管理着『要石』的天人.『要石』是能够引发和镇压地震的存在,当然也可以用来改变地形.因为在幻想乡引 ...

  3. cogs 920. [東方S1] 琪露诺

    二次联通门 : cogs 920. [東方S1] 琪露诺 /* cogs 920. [東方S1] 琪露诺 dp 方程为dp[i] = max (dp[i - L], dp[i - L + 1] ... ...

  4. cogs 997. [東方S2] 射命丸文

    二次联通门 : cogs 997. [東方S2] 射命丸文 /* cogs 997. [東方S2] 射命丸文 二维前缀和 枚举每个子矩阵 更新最大值.. 莫名rank1 */ #include < ...

  5. cogs 998. [東方S2] 帕秋莉·诺蕾姬

    二次联通门 : cogs 998. [東方S2] 帕秋莉·诺蕾姬 交上去后发现自己没上榜 就想着加点黑科技 把循环展开一下 结果WA了.. 万恶的姆Q /* cogs 998. [東方S2] 帕秋莉· ...

  6. cogs 999. [東方S2]雾雨魔理沙

    二次联通门 : cogs 999. [東方S2]雾雨魔理沙 摸你傻赛高!! /* cogs 999. [東方S2]雾雨魔理沙 原来以为是一道计算几何的题 可是细细一想发现.. 这就是一道dp 由于给定 ...

  7. cogs 2569. [東方] 博丽灵梦 梦想妙珠

    二次联通门 : cogs 2569. [東方] 博丽灵梦 梦想妙珠 /* cogs 2569. [東方] 博丽灵梦 梦想妙珠 莫队水过.. 好久没一遍AC了.. 卡线上榜2333 */ #includ ...

  8. java 覆盖hashCode()深入探讨 代码演示样例

    java 翻盖hashCode()深入探讨 代码演示样例 package org.rui.collection2.hashcode; /** * 覆盖hashcode * 设计HashCode时最重要 ...

  9. 【转】PV3D的小练习~太阳系八大行星

    转自:http://hi.baidu.com/boycy/item/70d1ba53bc8c3a958c12eddf http://www.cnblogs.com/flash3d/archive/20 ...

随机推荐

  1. 我的第一个netcore2.2 api项目搭建(三)

    上一章快速添加了swagger文档管理功能,我的第一个netcore2.2 api项目搭建(二) 这一章实现目标三:api添加身份验证功能 在实现该目标之前,先得理解netcore运行机制. 这是微软 ...

  2. C# vb .net图像合成-合成矩形

    在.net中,如何简单快捷地实现图像合成呢,比如合成文字,合成艺术字,多张图片叠加合成等等?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码 ...

  3. 类例程_c#战斗程序(窗体版)

    战士类代码: class Fight { String name; int attack, speed, crit, armor;// 生命.攻击力,攻速,暴击,护甲 public int life; ...

  4. mybatis中用注解如何处理存储过程返回的多个结果集?

    sql代码: create procedure sptest.getnamesanditems() reads sql data dynamic result sets 2 BEGIN ATOMIC ...

  5. [大数据学习研究] 错误排查,Hadoop集群部分DataNode不能启动

    错误现象 不知道什么原因,今天发现我的hadoop集群启动后datanode只有一台了,我的集群本来有三台的,怎么只剩一台了呢? 用jps命令检查一下,发现果然有两台机器的DataNode没有启动. ...

  6. SpringCloud SpringBoot 前后端分离企业级微服务架构源码赠送

    基于SpringBoot2.x.SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务敏捷开发系统架构.并引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手 ...

  7. Windows Server 2012 R2 远程桌面自动设置为不允许连接问题解决方案

    用“gpedit.msc”调出策略组设置窗口,在策略组界面点击:计算机配置->管理模块->Windows组件->远程桌面服务->远程桌面会话主机->连接->允许用户 ...

  8. Dijkstra算法求最短路径 Java实现

    基本原理: 迪杰斯特拉算法是一种贪心算法. 首先建立一个集合,初始化只有一个顶点.每次将当前集合的所有顶点(初始只有一个顶点)看成一个整体,找到集合外与集合距离最近的顶点,将其加入集合并检查是否修改路 ...

  9. MAC安装配置maven环境变量

    1.下载maven包: 下载链接:

  10. springboot 集成J2Cache

    J2Cache 是 OSChina 目前正在使用的两级缓存框架.第一级缓存使用 Ehcache,第二级缓存使用 Redis .由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目 ...