二次联通门 : 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. laravel中hasOne、HasMany、belongsTo、belongsToMany的ORM方法

    在laravel5.4框架中,使用ORM关联方法,一对一,一对多 一对一关系,代码: user表为主表,需要向下找关联表的字段用hasOne video表为关联表,需要向上找关联表的字段用belong ...

  2. MySQL卸载与重装

    [卸载] 不推荐使用控制面板-->卸载程序,来卸载,容易出现报错. 使用电脑管家卸载很轻松. [删除注册列表] HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\S ...

  3. #define宏作用

    预处理器的任务 简单来讲,预处理器的任务就是执行源代码中的预处理指令,并对源代码进行相应的处理.因此,从预处理指令的类型来讲,预处理器的任务包括如下的几个部分: 将其他文件包含到当前文件中. 定义宏, ...

  4. pandas-16 pd.merge()的用法

    pandas-16 pd.merge()的用法 使用过sql语言的话,一定对join,left join, right join等非常熟悉,在pandas中,merge的作用也非常类似. 如:pd.m ...

  5. 43、css实现镂空半圆环

    <style> .circle { position: relative; box-sizing: border-box; } .big { width: 140px; height: 1 ...

  6. js 对象克隆方法总结(不改变原对象)

    1.通用对象克隆: function clone(obj){ let temp = null; if(obj instanceof Array){ temp = obj.concat(); }else ...

  7. JavaScript 变量与注释

    一.变量 ECMAScript 的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据. 换句话说,每个变量仅仅是一个用于保存值的占位符而已.定义变量时要使用 var 操作符(注意 var 是 ...

  8. CSS 样式的使用方式、选择器

    在html中使用css的三种方式: 1.行内样式:同过元素的style属性来设置 <p style="font-size:20px; color:red">hello& ...

  9. CentOS7 安装 浏览器

    firefox(火狐) sudo yum install firefox chrome(谷歌) 添加源:sudo wget http://repo.fdzh.org/chrome/google-chr ...

  10. 在windows 10 64位系统下安装TensorFlow

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/mao_hui_fei/article/de ...