| Time Limit: 2000MS | Memory Limit: 64000K | |
| Total Submissions: 1667 | Accepted: 532 | |
| Case Time Limit: 1000MS | ||
Description
Input
Output
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
Source
#include <map>
#include <set>
#include <list>
#include <stack>
#include <queue>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 40010;
const int M = 40010;
struct node
{
int weight;
int next;
int to;
}edge[M << 1];
int tot, res, ans, n, m, k, root, size;
int head[N], num[N], dp[N];
bool vis[N];
int dist[N];
void addedge(int from, int to, int weight)
{
edge[tot].weight = weight;
edge[tot].to = to;
edge[tot].next = head[from];
head[from] = tot++;
}
void get_root(int u, int fa)
{
dp[u] = 0;
num[u] = 1;
for (int i = head[u]; ~i; i = edge[i].next)
{
int v = edge[i].to;
if (v == fa || vis[v])
{
continue;
}
get_root(v, u);
num[u] += num[v];
dp[u] = max(dp[u], num[v]);
}
dp[u] = max(dp[u], size - num[u]);
if (dp[root] > dp[u])
{
root = u;
}
}
void calc_dist(int u, int d, int fa)
{
dist[res++] = d;
for (int i = head[u]; ~i; i = edge[i].next)
{
int v = edge[i].to;
if (v == fa || vis[v])
{
continue;
}
calc_dist(v, d + edge[i].weight, u);
}
}
int calc(int u, int d)
{
res = 0;
calc_dist(u, d, -1);
int ret = 0;
sort(dist, dist + res);
int i = 0, j = res - 1;
while (i < j)
{
while (i < j && dist[i] + dist[j] > k)
{
j--;
}
ret += j - i;
i++;
}
return ret;
}
void solve()
{
ans += calc(root, 0);
vis[root] = 1;
for (int i = head[root]; ~i; i = edge[i].next)
{
int v = edge[i].to;
if (vis[v])
{
continue;
}
ans -= calc(v, edge[i].weight);
root = 0;
dp[0] = size = num[v];
get_root(v, -1);
solve();
}
}
int main()
{
int u, v, w;
char dir[5];
while (~scanf("%d%d", &n, &m))
{
memset( head, -1, sizeof(head) );
memset ( num, 0, sizeof(num) );
memset ( vis, 0, sizeof(vis) );
tot = 0;
ans = 0;
root = 0;
for (int i = 0; i < m; ++i)
{
scanf("%d%d%d%s", &u, &v, &w, dir);
addedge(u, v, w);
addedge(v, u, w);
}
scanf("%d", &k);
dp[0] = size = n;
get_root(1, -1);
solve();
printf("%d\n", ans);
}
return 0;
}原文地址:http://blog.csdn.net/guard_mine/article/details/40819379