二次联通门 : 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. SUSE12SP3-Samba配置

    简介 samba官网:https://www.samba.org/ 维基百科: https://zh.wikipedia.org/wiki/Samba Samba,是种用来让UNIX系列的操作系统与微 ...

  2. dapper.common新增概念object to sql

    Dapper.Common About author Email:@qq.com QQ: QQGroup: Config DbContextFactory.AddDataSource(new Data ...

  3. layout_gravity 属性和 gravity属性的区别

    安卓中  LinearLayout有两个非常相似的属性: android:gravity与android:layout_gravity. 区别在于: android:gravity 属性是对该view ...

  4. VsCode中编写python环境配置

    1. VsCode中编写python环境配置 1.1. 前言 有过开发经验都知道idea一系列的软件虽然功能比较多,但比较容易卡,电脑不好还真容易上火,这里我想要入门python,还是选了款vscod ...

  5. Java 控制流程 之 循环语句

    循环:循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复 执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一 ...

  6. JAVA - Windows下JDK自动设置脚本

    CMD窗口如果使用下面脚本代码出现乱码,则按照下文处理后,就可以了: https://www.cnblogs.com/sunylat/p/11308037.html @echo off echo ** ...

  7. RxJS——可观察的对象(Observable)

    可观察的(Observable) 可观察集合(Observables)是多值懒推送集合.它们填补了下面表格的空白: SINGLE MULTIPLE Pull Function Iterator Pus ...

  8. 【漏洞复现】Apache Solr via Velocity template远程代码执行

    0x01 概述 Solr简介 Apache Solr 是一个开源的企业级搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现.Apache Solr ...

  9. spring注入注解@Resource和@Autowired

    一.@Autowired和@Qualifier @Autowired是自动注入的注解,写在属性.方法.构造方法上,会按照类型自动装配属性或参数.该注解,可以自动装配接口的实现类,但前提是spring容 ...

  10. 详解Linux操作系统的进程

    系统 计算机运行起来以后,就是由内核和运行在内核之上的众多进程来实现的(kernel+process) 内存分为 :    线性内存: 物理内存: 计算机的所有运行都只在内存和CPU中运行! 内核空间 ...