题目背景

十个地方十人十色

全部都是猥琐大叔

这里也是那里也是

行踪可疑

现如今hentai横行,警察叔叔们不得不采取特♂殊手段惩戒这些家伙

题目描述

魅力之都是一个有N个路口,M条双向道路连接的城市。警察叔叔绘制了一张特殊的地图,在地图上只保留了N-1条道路,我们称这些道路为【特殊道路】,要保证任意两个路口间有且仅有一条路径,且满足所有保留的道路长度之和最小。

现在要在其中一个连接有多条【特殊道路】的路口设立【根据地】,去掉【根据地】所在路口后,就会出现某些路口间无法通过【特殊道路】相互连通的情况,我们认为这时仍然能够通过【特殊道路】连通的路口属于同一个【区域】。警察叔叔希望最后每个【区域】的【特殊道路】总长尽可能平均。警察叔叔找到了hzwer,但是hzwer是个无向图和有向图都无法区分的蒟蒻,请你帮他计算出应该选择哪一个路口作为【根据地】。

(尽可能平均即权值最小,设每一块【区域】的路线总长为Length[i](包括连接【根据地】与该【区域】的边),平均路线长度为Avg=SUM{Length[i]}/区域数,权值d=∑ (Length[i]-Avg)^2

输入格式

第1行:2个正整数N,M

第2..M+1行:每行2个整数u,v和1个实数len,表示u,v之间存在长度为len的边

输出格式

第1行:1个整数,最后选择的路口编号(存在多个可选路口时选择编号小的)

样例数据 1

输入  [复制]

 

3 3 
3 1 5 
3 2 4 
1 2 3

输出

2

样例数据 2

输入  [复制]

 

3 3 
2 1 825.7291 
3 2 397.4120 
1 3 633.1370

输出

3

备注

对于60%的数据:3 ≤ N ≤ 2,000,N-1 ≤ M ≤ 50,000

对于100%的数据:3 ≤ N ≤ 40,000,N-1 ≤ M ≤ 200,000

对于100%的数据:0 < len ≤ 100,000,000

保证不存在相同距离的线路,两个路口间可能出现多条路径,且任意点对间至少存在一条路径

首先最小生成树搞出来

然后dfs随便搞成一棵树

枚举每一个点,和它连通的部分就是它的每一个子树和整棵树除了它所在的子树以外的各个部分

它是长这样子的

在dfs的时候维护节点的子树个数和子树中的边权和

然后就可做了。注意权值相同取最小,所以要倒for

其实是水题……但是比赛时保存最小值的才开100e就30分……不能忍啊……比赛完开到5000ee就A了

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<ctime>
#define LL long long
#define inf 0x7ffffff
#define pa pair<int,int>
#define pi 3.1415926535897932384626433832795028841971
#define N 100010
#define M 300010
using namespace std;
struct MST{int l,r;double x;}bian[M];
struct edge{int to,next;double v;}e[2*M];
int n,m,cnt,ans,dsu[N];
int head[N];
int fa[N];
int sontype[N];
double tot,sumv[N];
bool mrk[N];
bool operator < (const MST &a,const MST &b){return a.x<b.x;}
inline int getfa(int x){return dsu[x]==x?x:dsu[x]=getfa(dsu[x]);}
inline void ins(int u,int v,double w)
{
e[++cnt].to=v;
e[cnt].v=w;
e[cnt].next=head[u];
head[u]=cnt;
}
inline void insert(int u,int v,double w)
{
ins(u,v,w);
ins(v,u,w);
}
inline void dfs(int now)
{
if (mrk[now])return;
mrk[now]=1;
for (int i=head[now];i;i=e[i].next)
if(!mrk[e[i].to])
{
sontype[now]++;
dfs(e[i].to);
fa[e[i].to]=now;
sumv[now]+=e[i].v+sumv[e[i].to];
}
}
inline LL read()
{
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
n=read();m=read();
for (int i=1;i<=m;i++)
{
bian[i].l=read();
bian[i].r=read();
scanf("%lf",&bian[i].x);
}
sort(bian+1,bian+m+1);
tot=50000000000000000000.0;
for (int i=1;i<=n;i++)dsu[i]=i;
for (int i=1;i<=m;i++)
{
int x=getfa(bian[i].l);
int y=getfa(bian[i].r);
if (x==y)continue;
insert(bian[i].l,bian[i].r,bian[i].x);
dsu[x]=y;
}
dfs(1);
for (int i=n;i>=1;i--)
{
int son=sontype[i]+(fa[i]!=0);
if (son<2)continue;
double sum=0,avg=sumv[1]/son,res=sumv[1]-sumv[i];
for (int j=head[i];j;j=e[j].next)
if (e[j].to!=fa[i])
{
sum+=(double)(e[j].v+sumv[e[j].to]-avg)*(e[j].v+sumv[e[j].to]-avg);
}
if (i!=1)sum+=(res-avg)*(res-avg);
if(sum<=tot)
{
tot=sum;
ans=i;
}
}
printf("%d\n",ans);
}

  

codecomb 2100【警察叔叔就是这个人!】的更多相关文章

  1. 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数。最多应为 2100

    出现这个问题的背景是,判断一批激活码在系统中是否已经存在,很傻的一个作法是,把这一批激活码,以in(in (‘ddd‘,‘aaa‘))的形式来处理,导致问题的出现. 后来,查找资料,http://bb ...

  2. codecomb 2091【路径数量】

    好久没有更新博客了啊……屯了一堆题没发呢 这是丧心病狂的hzwer每日NOI模拟赛第一天的第一题 妈蛋说好的NOIP难度图论算法两题网络流!让我说什么好 唔……codecomb的页面在晚上就会变得很奇 ...

  3. BZOJ 2100: [Usaco2010 Dec]Apple Delivery( 最短路 )

    跑两遍最短路就好了.. 话说这翻译2333 ---------------------------------------------------------------------- #includ ...

  4. jetbrains的JetBrains PyCharm 2018.3.1破解激活到2100年(最新亲测可用)

    破解补丁激活 之前看了好多的其它的方法感觉都不是很靠谱还是这个本人亲试可以长期有效不仅能激活pycharm.jetbrains的JetBrains PyCharm 2018.3.1破解激活到2100年 ...

  5. 【BZOJ】2100: [Usaco2010 Dec]Apple Delivery(spfa+优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2100 这题我要吐血啊 我交了不下10次tle.. 噗 果然是写挫了. 一开始没加spfa优化果断t ...

  6. POJ 2100:Graveyard Design(Two pointers)

    [题目链接] http://poj.org/problem?id=2100 [题目大意] 给出一个数,求将其拆分为几个连续的平方和的方案数 [题解] 对平方数列尺取即可. [代码] #include ...

  7. [BZOJ 2100] Apple Delivery

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2100 [算法] Answer = min{ dist(PB,PA1) + dist( ...

  8. 使用 Mybatis 框架 jdbc 方式批量写入 SQL Server,报错 com.microsoft.sqlserver.jdbc.SQLServerException 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数,最多应为2100

    这个错是sqlserver抛出来的. 进过验证,上述错误中的2100为插入的总字段数. 比如下面这种插入方式,values后面的一个括号里的字段为30个,那么后面最多只能加70条,即这种批量插入方式一 ...

  9. limits the number of elements in an IN predicate to 2100 entries.

    org.hibernate.engine.jdbc.spi.SqlExceptionHelper 131 - [TxId : f68db5f5b-qmgnc^1561639897640^271530 ...

随机推荐

  1. unix c 09

    IPC - 进程间通信   文件/信号/管道/共享内存/消息队列/信号量集/网络   XSI IPC (共享内存.消息队列和信号量集)   使用方式 非常的类似. 共享内存的使用步骤:     1 生 ...

  2. C# 判断两个日期是否是同一天

    System.Data.Entity.DbFunctions.DiffDays(cs.StartTime.Value,DateTime.Now) == 0//只获取当天 OR XX.StartTime ...

  3. Palindrome Partitioning 解答

    Question Given a string s, partition s such that every substring of the partition is a palindrome. R ...

  4. Android图形合成和显示系统---基于高通MSM8k MDP4平台

    介绍了Android SurfaceFlinger层次以下的图形合成和显示系统,主要基于高通MSM8k MDP4x平台. 做为Android Display专题.SurfaceFlinger的详细介绍 ...

  5. PHP二分查找(递归和循环)

    二分查找可以通过递归和循环来实现, 思路如下: 将要查找的数和中间数进行比较, 如果相等,则表示找到,返回下标 如果要查找的数小于中间这个数,则说明要查找的数分布在数组左边,修改right边界,使其等 ...

  6. HDU4907小技巧

    原题http://acm.hdu.edu.cn/showproblem.php?pid=4907 Task schedule Time Limit: 2000/1000 MS (Java/Others ...

  7. poj 1523 SPF(tarjan求割点)

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  8. TCP三次握手的过程

    三次握手 下图就是wireshark抓包工具抓获的TCP连接建立的三次握手过程: http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415. ...

  9. CSS基础笔记

    之前没有开通好博客,笔记都记录在有道云,今天全部转过来!!! 1.当同一个html元素不止一个样式定义时,内联样式(在html元素内部)拥有最高的优先权:其他如内部样式表(位于<head> ...

  10. 基于avalon1.4.x ----分页组件编写

    avalon分页组件 (1.4.x版本) 随着avalon2的推出,avalon1的官网已经不再维护了,现在似乎是找不到avalon 1.4版本的官方文档了,所以本文章所有的内容均不保证正确性,只能保 ...