题目背景

十个地方十人十色

全部都是猥琐大叔

这里也是那里也是

行踪可疑

现如今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. 10个工具让你的 shell 脚本更强大

    10个工具让你的 shell 脚本更强大 很多人误以为shell脚本只能在命令行下使用.其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等.你可以控制最终的输出,光标位 置还有各种输 ...

  2. VS如何关闭 ReSharper 提示

    IDE->工具->选项->click "suspend now" button

  3. HDU 5418 Victor and World (Floyd + 状态压缩DP)

    题目大意:从起点 1 开始走遍所有的点,回到起点 1 ,求出所走的最短长度. 思路:首先利用 Floyed 求出任意两点之间的最短距离 dis[i][j].求出任意两点之间的最短距离后,运用动态规划. ...

  4. poj 2411 Mondriaan's Dream_状态压缩dp

    题意:给我们1*2的骨牌,问我们一个n*m的棋盘有多少种放满的方案. 思路: 状态压缩不懂看,http://blog.csdn.net/neng18/article/details/18425765 ...

  5. 第13讲- Android之消息提示Notification

    第13讲 Android之消息提示Notification .Notification Notification可以理解为通知的意思一般用来显示广播信息,通知可以显示到系统的上方的状态栏(status ...

  6. 判断一个int 型整数 是否为回文数

    leetcode 上的题目 Determine whether an integer is a palindrome. Do this without extra space. 由于不能使用额外空间, ...

  7. [置顶] Android项目组织和代码重用

    在Android应用开发过程中,只要涉及两个或以上人的开发,就需要考虑分工和代码的组织和重用问题. 代码重用有三种方式: 1.APK: 2.JAR:通过Libs/ 和Build path集成,缺点是不 ...

  8. 内外连接、组函数、DDL、DML和TCL

    前言 cross join ,是笛卡尔积:nature join 是自然连接. 正文 内外连接 inner join inner join 的inner能够省略. 内连接 在一个表中可以找到在还有一个 ...

  9. jsp当参数为空的时候默认显示值

    当${business.branchName }为空或者不存在的时候显示“请选择门店” <c:out value="${business.branchName }" defa ...

  10. [HeadFist-HTMLCSS学习笔记][第四章Web镇之旅]

    重要 访问一个目录,即是访问他的index <a>链接到网站,必须加http:// <a>的title属性,能预先知道链接信息 id属性 使得<a> 能再本地跳转. ...