[HDU - 5441]Travel

大意:告诉你有n个点  m个边的无向图  

然后问有多少点对  他们的路径上节点之间的距离都少于 x

思路:

并查集

离线处理。将边权值按从小到大排序,查询标号后按照从小到大排序。对于每次查询,依次将比当前查询值小的边加入并查集。

复制代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int t;
int n,m,q;
struct  path
{
    int starts;
    int ends;
    int weight;
     bool operator <(const path &x)const{
      return weight<x.weight;
     }
}P[100000 + 5];
struct input
{
    int id;
    int limit;
    bool operator <(const input &x)const{
      return limit < x.limit;
     }
}L[100000 + 5];
long long ans[5000 + 5];
int father[20000 + 5];
int cnt[20000 + 5];

int Find(int x)
{
    return father[x] == x ? x : father[x] = Find(father[x]);
}

void init()
{
    for (int j = 1; j <= n; j++)
    {
        father[j] = j;
        cnt[j] = 1;
    }
    memset(ans,0,sizeof(ans));
}
int main()
{
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d%d%d", &n, &m, &q);
        for (int i = 0; i < m; i++)
            scanf("%d %d %d", &P[i].starts, &P[i].ends, &P[i].weight);
        sort(P, P + m);
        for (int i = 0; i < q; i++)
        {
            L[i].id = i;
            scanf("%d", &L[i].limit);
        }
        sort(L, L + q);
        init();
        int cur = 0;
        long long sum = 0;
        for (int i = 0; i < q; i++)
        {
            while (cur < m && L[i].limit >= P[cur].weight)
            {
                int fstarts = Find(P[cur].starts);
                int fends = Find(P[cur].ends);
                if(fstarts != fends)
                {
                    sum += cnt[fstarts] * cnt[fends]; //将总联通块合并,再将合并之前的已有的减去,得到的算式化简得
                    father[fends] = fstarts;
                    cnt[fstarts] += cnt[fends];
                }
                cur++;
            }
            ans[L[i].id] = sum;
        }
        for(int i = 0; i < q; i++)
            printf("%lld\n", 2 * ans[i]);
}
return 0;
}
复制代码

 

posted @   ViKyanite  阅读(108)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示
主题色彩