博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
景点中心 C组模拟赛
阅读量:6495 次
发布时间:2019-06-24

本文共 1164 字,大约阅读时间需要 3 分钟。

题目大意:

镇海中学共有n个景点,每个景点均有若干学生正在参观。这n个景点以自然数1至n编号,每两个景点的编号均不同。每两个景点之间有且只有一条路径。选择哪个景点集中的学生,才能使所有学生走过的路径之和最小呢?

解题思路:

先以1为root搜一次,求出num[i]和ans[i],num[i]是从i到1的学生数量总和,ans[i]是从i到1的代价

然后再搜一次,每次加上(第一个景点的学生人数-上个景点的学生人数)×路径长度-这个景点的学生人数×路径长度,然后存于sum[i]中,sum[i]则为以i为集合点的代价
maxn为在最小代价的情况下的集合点

源程序:

#include
#include
#define inf 1e18#define N 1000001using namespace std;struct node{ int x,y,w,next;}a[N];bool v[N];int n,len,maxn,xx[N],last[N];long long num[N],ans[N],sum[N];void add(int x,int y,int w){ a[++len].x=x;a[len].y=y;a[len].w=w;a[len].next=last[x];last[x]=len; a[++len].x=y;a[len].y=x;a[len].w=w;a[len].next=last[y];last[y]=len;}void dfs(int x,int rw){ v[x]=1;//已经搜过做标记 num[x]=xx[x]; ans[x]=xx[x]*rw;//计算num和ans for (int i=last[x];i;i=a[i].next) { int y=a[i].y; if (!v[y]) { dfs(y,rw+a[i].w);//往下搜 ans[x]+=ans[y];//加上搜到的结果 num[x]+=num[y];//加上搜到的结果 } }}int find(int x,int rw,int fa,int from){ v[x]=1; if (x!=1) sum[x]=sum[fa]+(num[1]-num[x])*a[from].w-num[x]*a[from].w;//计算代价 if (sum[x]

转载于:https://www.cnblogs.com/Juruo-HJQ/p/9306883.html

你可能感兴趣的文章
指向方法之委托(一)
查看>>
2013 Multi-University Training Contest 3 部分解题报告
查看>>
Linux 网桥配置命令:brctl
查看>>
jQuery中异步操作对象Deferred
查看>>
MVC设计模式
查看>>
在团队项目遇到的问题及解决方法。
查看>>
springcloud demo---config-client
查看>>
Java LeetCode 1.Two Sum
查看>>
前端面试题:css相关面试题
查看>>
最长回文子序列-----动态规划
查看>>
Vue国际化实现
查看>>
设计模式:单例模式
查看>>
FLASH位宽为8、16、32时,CPU与外设之间地址线的连接方法
查看>>
双网卡一般情况不能有两个网关 (转)
查看>>
xshell 远程连接Linux
查看>>
Linux计划任务及压缩归档(week2_day1)--技术流ken
查看>>
微信小程序登录 该死的官方文档TypeError: the JSON object must be str, not 'bytes'
查看>>
VMware 虚拟机克隆 CentOS 6.5 之后,网络配置问题的解决方案
查看>>
Python ( 1 ) ----- 简介
查看>>
[linux基础学习]run level
查看>>