cogs 944. [東方S3] 藤原妹红
二次联通门 : 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] 藤原妹红的更多相关文章
- cogs 943. [東方S3] 铃仙•优昙华院•稻叶
二次联通门 : cogs 943. [東方S3] 铃仙•优昙华院•稻叶 /* cogs 943. [東方S3] 铃仙·优昙华院·稻叶 概率dp 貌似做麻烦了 邻接矩阵和链式前向星都用上了... dp[ ...
- COGS 942. [東方S3] 比那名居天子
Problem 1 比那名居天子(tenshi.cpp/c/pas) 题目描述 在幻想乡,比那名居天子是管理着『要石』的天人.『要石』是能够引发和镇压地震的存在,当然也可以用来改变地形.因为在幻想乡引 ...
- cogs 920. [東方S1] 琪露诺
二次联通门 : cogs 920. [東方S1] 琪露诺 /* cogs 920. [東方S1] 琪露诺 dp 方程为dp[i] = max (dp[i - L], dp[i - L + 1] ... ...
- cogs 997. [東方S2] 射命丸文
二次联通门 : cogs 997. [東方S2] 射命丸文 /* cogs 997. [東方S2] 射命丸文 二维前缀和 枚举每个子矩阵 更新最大值.. 莫名rank1 */ #include < ...
- cogs 998. [東方S2] 帕秋莉·诺蕾姬
二次联通门 : cogs 998. [東方S2] 帕秋莉·诺蕾姬 交上去后发现自己没上榜 就想着加点黑科技 把循环展开一下 结果WA了.. 万恶的姆Q /* cogs 998. [東方S2] 帕秋莉· ...
- cogs 999. [東方S2]雾雨魔理沙
二次联通门 : cogs 999. [東方S2]雾雨魔理沙 摸你傻赛高!! /* cogs 999. [東方S2]雾雨魔理沙 原来以为是一道计算几何的题 可是细细一想发现.. 这就是一道dp 由于给定 ...
- cogs 2569. [東方] 博丽灵梦 梦想妙珠
二次联通门 : cogs 2569. [東方] 博丽灵梦 梦想妙珠 /* cogs 2569. [東方] 博丽灵梦 梦想妙珠 莫队水过.. 好久没一遍AC了.. 卡线上榜2333 */ #includ ...
- java 覆盖hashCode()深入探讨 代码演示样例
java 翻盖hashCode()深入探讨 代码演示样例 package org.rui.collection2.hashcode; /** * 覆盖hashcode * 设计HashCode时最重要 ...
- 【转】PV3D的小练习~太阳系八大行星
转自:http://hi.baidu.com/boycy/item/70d1ba53bc8c3a958c12eddf http://www.cnblogs.com/flash3d/archive/20 ...
随机推荐
- 将EntityFrameworkCore生成的SQL语句输出到控制台,使用hangfire
将EntityFrameworkCore生成的SQL语句输出到控制台 参考文档如下 EF Core 日志记录要求使用一个或多个日志记录提供程序配置的 ILoggerFactory. 日志记录-EF C ...
- 备忘】HttpContextAccessor类
AspNetCore / src / Http / Http / src / HttpContextAccessor.cs // Copyright (c) .NET Foundation. All ...
- English--名词从句
English|名词从句 现在开始讲述关于名词从句的内容.从句大家都不陌生,但是学习了那么多年,什么是从句?接下来让我们一起来看看. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知 ...
- SimHash算法--文章相似度匹配
SimHash原理 1.SimHash背景 SimHash算法来自于 GoogleMoses Charikar发表的一篇论文"detecting near-duplicates for we ...
- CSS 精灵技术(sprite)
一.精灵技术产生的背景 图所示为网页的请求原理图,当用户访问一个网站时,需要向服务器发送请求,网页上的每张图像都要经过一次请求才能展现给用户. 然而,一个网页中往往会应用很多小的背景图像作为修饰,当 ...
- ML-求解 SVM 的SMO 算法
这算是我真正意义上认真去读的第一篇ML论文了, but, 我还是很多地方没有搞懂, 想想, 缓缓吧, 还是先熟练调用API 哈哈 原论文地址: https://www.microsoft.com/en ...
- pandas 之 数据清洗-缺失值
Abstract During the course fo doing data analysis and modeling, a significant amount of time is spen ...
- 自定义View(三),仿支付宝芝麻信用自定义控件
仿支付宝的芝麻信用仪表盘 实现的效果 实现的功能: 指针和数字动态改变 背景动态变化 没了... 代码如下 MyCustomView.java package com.example.testcust ...
- ARM架构体系
架构 处理器家族 ARMv1 ARM1 ARMv2 ARM2.ARM3 ARMv3 ARM6, ARM7 ARMv4 StrongARM.ARM7TDMI.ARM9TDMI ARMv5 ARM7EJ. ...
- SQL注入(2)
SQL注入id title content time author select * from news where id = 1; select 1,2,3,4,5,6 from table ...