Mart Master II

Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 675    Accepted Submission(s): 237

Problem Description
Trader Dogy lives in city S, which consists of n districts. There are n - 1 bidirectional roads in city S, each connects a pair of districts. Indeed, city S is connected, i.e. people can travel between every pair of districts by roads.

In some districts there are marts founded by Dogy’s competitors. when people go to marts, they’ll choose the nearest one. In cases there are more than one nearest marts, they’ll choose the one with minimal city number.

Dogy’s money could support him to build only one new marts, he wants to attract as many people as possible, that is, to build his marts in some way that maximize the number of people who will choose his mart as favorite. Could you help him?

 
Input
There are multiple test cases. Please process till EOF.

In each test case:

First line: an integer n indicating the number of districts.

Next n - 1 lines: each contains three numbers bi, ei and wi, (1 ≤ bi,ei ≤ n,1 ≤ wi ≤ 10000), indicates that there’s one road connecting city bi and ei, and its length is wi.

Last line : n(1 ≤ n ≤ 105) numbers, each number is either 0 or 1, i-th number is 1 indicates that the i-th district has mart in the beginning and vice versa.

 
Output
For each test case, output one number, denotes the number of people you can attract, taking district as a unit.
 
Sample Input
5
1 2 1
2 3 1
3 4 1
4 5 1
1 0 0 0 1
5
1 2 1
2 3 1
3 4 1
4 5 1
1 0 0 0 0
1
1
1
0
 
Sample Output
2
4
0
1
/*
hdu 5016 点分治(2014 ACM/ICPC Asia Regional Xi'an Online) problem:
有n个城市,有的城市有集市. 城市会选择离他最近,编号最小的集市. 如果再建一个集市,那么最多有多少个城市会来这 solve:
如果 城市v的人要到新的集市u 那么dis(u,v) < dis(v,z).(z为原先离v最近的集市)
所以可以先用最短路求出所有城市的最近集市的距离和编号.
如果用dis表示到根节点的距离,那么 dis[u] + dis[v] < spfa(v,z) ----> dis[u] < dis[v]-spfa(v,z)
所以就成了:求对u而言满足这个公式的点的个数. hhh-2016-08-24 16:17:48
*/
#pragma comment(linker,"/STACK:124000000,124000000")
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <vector>
#include <math.h>
#include <queue>
#include <map>
#define lson i<<1
#define rson i<<1|1
#define ll long long
#define clr(a,b) memset(a,b,sizeof(a))
#define scanfi(a) scanf("%d",&a)
#define scanfl(a) scanf("%I64d",&a)
#define key_val ch[ch[root][1]][0]
#define inf 0x3f3f3f3f
#define mod 1000003
using namespace std;
const int maxn = 100010;
int head[maxn];
int n,k,s[maxn],f[maxn],root,is[maxn];
int Size,tot,u,v,w;
bool vis[maxn];
ll ans[maxn];
ll finans = 0;
ll val;
struct node
{
int to,w;
int next;
} edge[maxn << 2]; void ini()
{
clr(head,-1);
clr(s,0),clr(ans,0);
tot = 0;
} void add_edge(int u,int v,int w)
{
edge[tot].to = v,edge[tot].w = w,edge[tot].next = head[u],head[u] = tot++;
}
pair<int,int> tp[maxn]; void spfa()
{
memset(vis,0,sizeof(vis));
queue<int>q;
for(int i =1; i <= n; i++)
{
if(is[i])
{
tp[i] = make_pair(0,i);
vis[i] = 1;
q.push(i);
}
else
{
tp[i] = make_pair(inf,i);
}
}
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = 0;
for(int i = head[u]; ~i ; i = edge[i].next)
{
int v = edge[i].to;
if(tp[v].first > tp[u].first + edge[i].w)
{
tp[v].first = tp[u].first + edge[i].w;
tp[v].second = tp[u].second;
if(!vis[v])
{
vis[v] = 1;
q.push(v);
}
}
}
}
} void get_root(int now,int fa)
{
int v;
s[now] = 1,f[now] = 0;
for(int i = head[now]; ~i; i = edge[i].next)
{
if((v=edge[i].to) == fa || vis[v])
continue;
get_root(v,now);
s[now] += s[v];
f[now] = max(f[now],s[v]);
}
f[now] = max(f[now],Size-s[now]);
if(f[now] < f[root]) root = now;
}
int num;
int seq[maxn];
int d[maxn];
void dfs(int now,int fa)
{
int v;
seq[num++] = now;
s[now] = 1; for(int i = head[now]; ~i; i = edge[i].next)
{
// cout << edge[i].to << " " <<vis[edge[i].to]<<" " << fa <<endl;
if( (v=edge[i].to) == fa || vis[v])
continue;
d[v] = d[now] + edge[i].w;
dfs(v,now);
s[now] += s[v];
}
}
pair<int,int>t[maxn];
void cal(int now,int ob)
{
num = 0;
d[now] = ob;
dfs(now,0);
// cout <<"root:" << now <<endl;
for(int i=0; i < num; i++)
{
// cout << tp[seq[i]].first-d[seq[i]] << " ";
t[i] = make_pair(tp[seq[i]].first-d[seq[i]],tp[seq[i]].second);
}
// cout <<endl;
// for(int i = 0;i < num ;i++)
// {
// cout << d[seq[i]] << " ";
// }
// cout <<endl;
sort(t,t+num); for(int i = 0; i < num; i++)
{
if(is[seq[i]])
continue;
pair<int,int> temp = make_pair(d[seq[i]],seq[i]);
int pos = lower_bound(t,t+num,temp)-t;
// cout << num <<" " <<pos <<endl;
if(!ob)
ans[seq[i]] += (ll)(num - pos);
else
ans[seq[i]] += (ll)(pos - num);
}
} void make_ans(int now,int cnt)
{
int v ;
f[0] = Size = cnt;
get_root(now,root = 0); cal(root,0);
vis[root] = 1;
for(int i = head[root]; ~i ; i = edge[i].next)
{
if( vis[v = edge[i].to] )
continue;
cal(v,edge[i].w);
make_ans(v,s[v]);
}
} int main()
{
// freopen("in.txt","r",stdin);
while( scanfi(n) != EOF)
{
ini();
finans = 0;
for(int i = 1; i < n; i++)
{
scanfi(u),scanfi(v),scanfi(w);
add_edge(u,v,w);
add_edge(v,u,w);
}
for(int i =1; i<= n; i++)
scanfi(is[i]);
spfa();
// for(int i = 1;i <= n;i++)
// {
// printf("%d %d\n",tp[i].first,tp[i].second);
// }
memset(vis,0,sizeof(vis));
make_ans(1,n);
for(int i = 1;i <=n;i++)
{
finans = max(finans,ans[i]);
}
// cout <<"ans";
printf("%I64d\n",finans);
}
return 0;
}

  

hdu 5016 点分治(2014 ACM/ICPC Asia Regional Xi'an Online)的更多相关文章

  1. HDU 5010 Get the Nut(2014 ACM/ICPC Asia Regional Xi'an Online)

    思路:广搜, 因为空格加上动物最多只有32个那么对这32个进行编号,就能可以用一个数字来表示状态了,因为只有 ‘P’   'S' 'M' '.' 那么就可以用4进制刚好可以用64位表示. 接下去每次就 ...

  2. 2014 ACM/ICPC Asia Regional Xi'an Online(HDU 5007 ~ HDU 5017)

    题目链接 A题:(字符串查找,水题) 题意 :输入字符串,如果字符串中包含“ Apple”, “iPhone”, “iPod”, “iPad” 就输出 “MAI MAI MAI!”,如果出现 “Son ...

  3. 2014 ACM/ICPC Asia Regional Xi'an Online

    03 hdu5009 状态转移方程很好想,dp[i] = min(dp[j]+o[j~i]^2,dp[i]) ,o[j~i]表示从j到i颜色的种数. 普通的O(n*n)是会超时的,可以想到o[]最大为 ...

  4. 2014 ACM/ICPC Asia Regional Xi'an Online Paint Pearls

    传说的SB DP: 题目 Problem Description Lee has a string of n pearls. In the beginning, all the pearls have ...

  5. HDU 5000 2014 ACM/ICPC Asia Regional Anshan Online DP

    Clone Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) Total Submiss ...

  6. HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...

  7. HDU 5002 Tree(动态树LCT)(2014 ACM/ICPC Asia Regional Anshan Online)

    Problem Description You are given a tree with N nodes which are numbered by integers 1..N. Each node ...

  8. HDU 5000 Clone(离散数学+DP)(2014 ACM/ICPC Asia Regional Anshan Online)

    Problem Description After eating food from Chernobyl, DRD got a super power: he could clone himself ...

  9. HDU 5052 Yaoge’s maximum profit 光秃秃的树链拆分 2014 ACM/ICPC Asia Regional Shanghai Online

    意甲冠军: 特定n小点的树权. 以下n每一行给出了正确的一点点来表达一个销售点每只鸡价格的格 以下n-1行给出了树的侧 以下Q操作 Q行 u, v, val 从u走v,程中能够买一个鸡腿,然后到后面卖 ...

随机推荐

  1. 第二十八条:利用有限制通配符来提升API的灵活性

    如第二十五条所述,参数化类型是不可变的.类型Type1和Type2而言,不管Type1与Type2的关系,List<Type1>既不是List<Type2>的子类型,也不是也不 ...

  2. CISCO路由器练习

    前言: 总结了昨天的学习和今天的单臂路由 写了今天的文章. 目录: 路由器的基本配置 单臂路由的练习 正文: 路由器基本配置 环境要求 cisco模拟器 2台交换机 2台PC 1台路由器 路由器介绍: ...

  3. 02-移动端开发教程-CSS3新特性(中)

    1. 新的背景 背景在CSS3中也得到很大程度的增强,比如背景图片尺寸.背景裁切区域.背景定位参照点.多重背景等. 1.1 background-size设置背景图片的尺寸 cover会自动调整缩放比 ...

  4. 偶遇vue-awesome-swiper的坑

    最近用vue重构一个移动端的项目,碰到了不少坑,今天拿移动端最著名的轮播插件swiper为例来说,由于这个项目没用UI库,纯手写的样式,沿用老的插件,自然而然的选择了vue-awesome-swipe ...

  5. python RE模块的使用

    摘要: re模块包括操作正则表达式的函数,一些工作中都需要用到,现在说明下使用方法. 使用说明: 一,re模块下的函数:            函数             描述 compile(pa ...

  6. react-native-image-picker 运用launchCamera直接调取摄像头的缺陷及修复

    在前几天用react-native进行android版本开发当中,用到了"react-native-image-picker"的插件:根据业务的需求:点击按钮-->直接调取摄 ...

  7. zuul入门(4)zuul的注解@EnableZuulServer和@EnableZuulProxy

    @EnableZuulServer.@EnableZuulProxy两个注解 @EnableZuulProxy简单理解为@EnableZuulServer的增强版,当Zuul与Eureka.Ribbo ...

  8. hadoop2.7.3+spark2.1.0+scala2.12.1环境搭建(2)安装hadoop

    一.依赖安装 安装JDK 二.文件准备 hadoop-2.7.3.tar.gz 2.2 下载地址 http://hadoop.apache.org/releases.html 三.工具准备 3.1 X ...

  9. css(1-1)样式表

    CSS Id 和 Class id 和 class 选择器 如果你要在HTML元素中设置CSS样式,你需要在元素中设置"id" 和 "class"选择器. id ...

  10. Python之匿名函数

    匿名函数 匿名函数:为了解决那些功能很简单的需求而设计的一句话函数. #这段代码 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lam ...