Travel
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2914 Accepted Submission(s): 998
For each test case, the first line consists of three integers n,m
Each of the following m
Then q
Note that (a,b)
1 5 5 3 2 3 6334 1 5 15724 3 5 5705 4 3 12382 1 3 21726 6000 10000 13000
2 6 12
#include<cstdio>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = 1e5 + 10;
int pre[maxn], num[maxn];
ll ans[maxn];
struct Edge
{
int from, to, value, color;
Edge(int from = 0, int to = 0, int value = 0) : from(from), to(to), value(value){ color = 0; }
void read()
{
scanf("%d%d%d",&from,&to,&value);
}
bool operator < (const Edge& b) const
{
return value < b.value;
}
}edge[maxn];
struct Out
{
int x, id;
bool operator < (const Out& b) const
{
return x < b.x;
}
}out[maxn];
int find(int x)
{
return pre[x] == x ? x : pre[x] = find(pre[x]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--) {
int n, m, q;
scanf("%d%d%d",&n,&m,&q);
for (int i = 0; i < m; i++) edge[i].read();
for (int i = 0; i < q; i++) {
scanf("%d",&out[i].x);
out[i].id = i;
}
sort(edge, edge + m);
sort(out, out + q);
for (int i = 1; i <= n; i++) pre[i] = i, num[i] = 1;
int j = 0;
ll cnt = 0;
for (int i = 0; i < q; i++) {
while (j < m && edge[j].value <= out[i].x) {
int x = edge[j].from;
int y = edge[j].to;
int fx = find(x), fy = find(y);
if (fx != fy) {
cnt += (ll)num[fx] * num[fy] * 2;
pre[fy] = fx;
num[fx] += num[fy];
}
j++;
}
ans[out[i].id] = cnt;
}
for (int i = 0; i < q; i++)
printf("%d\n",ans[i]);
}
}
553



被折叠的 条评论
为什么被折叠?



