求a,b之间所有路径最长边的最小值小于L的个数
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string.h>
#include <string>
using namespace std;
const int MAXN = 50000 + 38;
int n, m, q, l;
int ranks[MAXN / 5], pre[MAXN / 5], ans[MAXN / 5];
struct Node
{
int u, v, dis;
bool operator < (Node a) const
{
return dis < a.dis;
}
}node[MAXN];
struct Q
{
int l, id;
bool operator < (Q a) const
{
return l < a.l;
}
}qu[MAXN / 5];
void init()
{
for (int i = 0; i <= n; i++) pre[i] = i, ranks[i] = 1;
memset(ans, 0, sizeof(ans));
}
int finds(int x)
{
if (x == pre[x]) return x;
int r = finds(pre[x]);
ranks[r] += ranks[x], ranks[x] = 0;
pre[x] = r;
return r;
}
void input()
{
while (scanf("%d %d %d", &n, &m, &q) != EOF)
{
init();
for (int i = 0; i < m; i++)
{
scanf("%d %d %d", &node[i].u, &node[i].v, &node[i].dis);
}
sort(node, node + m);
for (int i = 0; i < q; i++)
{
scanf("%d", &qu[i].l), qu[i].id = i;
}
sort(qu, qu + q);
ans[qu[0].id] = 0;
for (int i = 0, j = 0; j < q; j++)
{
if (j != 0) ans[qu[j].id] = ans[qu[j - 1].id];
while (i < m && node[i].dis <= qu[j].l)
{
int fa = finds(node[i].u), fb = finds(node[i].v);
if (fa != fb)
{
ans[qu[j].id] += ranks[fa] * ranks[fb];
pre[fa] = fb;
ranks[fb] += ranks[fa], ranks[fa] = 0;
}
i++;
}
}
for (int i = 0; i < q; i++)
{
printf("%d\n", ans[i]);
}
}
}
int main()
{
input();
return 0;
}