您的位置:首页 > Web前端

POJ 1987 BZOJ 3365 USACO 2004 Feb Distance Statistics 路程统计 点分治

2016-04-03 18:11 791 查看
和POJ 1714一样。。

http://blog.csdn.net/huanghongxun/article/details/50967578

#include <cstdio>
#include <algorithm>
#include <cstring>
const int N = 40005, M = N * 2;
#define adj(i,j) for(int i=h[j];i;i=p[i])if(v[i]!=fa&&!vis[v[i]])
using namespace std;
int h
, p[M], w[M], v[M], cnt = 0;
int n, k, vis
, ans, rt, c;
void add(int a, int b, int c) {
v[++cnt] = b; w[cnt] = c; p[cnt] = h[a]; h[a] = cnt;
}
int mx
, sz
, mi, dis
;
void dfssize(int x, int fa) {
sz[x] = 1; mx[x] = 0;
adj(i,x) {
dfssize(v[i], x);
sz[x] += sz[v[i]];
if (sz[v[i]] > mx[x]) mx[x] = sz[v[i]];
}
}
void dfsrt(int r, int x, int fa) {
if (sz[r] - sz[x] > mx[x]) mx[x] = sz[r] - sz[x];
if (mx[x] < mi) mi = mx[x], rt = x;
adj(i,x) dfsrt(r, v[i], x);
}
void dfsdis(int x, int d, int fa) {
dis[c++] = d;
adj(i,x) dfsdis(v[i], d + w[i], x);
}
int calc(int x, int d) {
int ans = 0;
c = 0;
dfsdis(x, d, 0);
sort(dis, dis + c);
for (int i = 0, j = c - 1; i < j; ++i) {
for (; dis[i] + dis[j] > k && i < j; --j);
ans += j - i;
}
return ans;
}
void dfs(int x) {
int fa = 0;
mi = n;
dfssize(x, fa); dfsrt(x, x, fa);
ans += calc(rt, 0);
vis[rt] = 1;
adj(i, rt) {
ans -= calc(v[i], w[i]);
dfs(v[i]);
}
}
int main() {
int u, v, w, i, m; char redundancy[8];
while(scanf("%d%d", &n, &m) != EOF && (n || k)) {
memset(vis, 0, sizeof vis);
memset(h, 0, sizeof h);
cnt = ans = 0;
for (i = 0; i < m; i++) {
scanf("%d%d%d%s", &u, &v, &w, redundancy);
add(u, v, w); add(v, u, w);
}
scanf("%d", &k);
dfs(1);
printf("%d\n", ans);
}
return 0;
}


3365: [Usaco2004 Feb]Distance Statistics 路程统计

Description

在得知了自己农场的完整地图后(地图形式如前三题所述),约翰又有了新的问题.他提供


一个整数K(1≤K≤109),希望你输出有多少对农场之间的距离是不超过K的.

Input

第1到I+M行:与前三题相同;
第M+2行:一个整数K.


Output

农场之间的距离不超过K的对数.


Sample Input

7 6
1 6 13 E
6 3 9 E
3 5 7 S
4 1 3 N
2 4 20 W
4 7 2 S
10


Sample Output

5


Hint

有五对道路之间的距离小于10

1-4,距离为3

4-7,距离为2

1-7,距离为5

3-5,距离为7

3-6,距离为9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: